Uważaj na include i include_once!

Funkcja include() przydaje się w wielu sytuacjach. Jest też parę sztuczek i kruczków z tym związanych (o których mowa w manualu PHP).

Mój skrypt dzielił się na kilka akcji, odpalanych w jednej instancji po kolei. Pierwsza akcja wrzucała parę rekordów do bazy, a potem zapisywała ich ID do tablicy. Ta tablica natomiast była eksportowana do pliku w formacie:

<?php return array('foo', 'bar', 'baz'); ?>

Kolejna akcja wczytywała tą tablicę (za pomocą polecenia $arr = include(‘data.php’);), dokonywała na niej modyfikacji i ponownie zapisywała w podobny sposób, do tego samego pliku.

Po uprzednim przygotowaniu danych (przez akcje I i II), akcja III ponownie ładowała ten plik. Tutaj niestety był błąd, bo użyłem include_once() zamiast include(). Efekt tego był taki, że include_once() nie zwrócił tej tablicy, a jedynie przekazał wartość logiczną TRUE.

Sprawiło mi to niemały problem, ponieważ akcja III się wysypała, z powodu złych danych w zmiennej, a debugowanie było dość uciążliwe (ciężko było znaleźć błąd). Oczywiście łatwo domyślić się dlaczego tak się stalo. Z tego też powodu uczulam na użycie funkcji include_once w kontekście zwracania zmiennych. Zamiast tego należy użyć include().

Jak wspomniałem, takie zachowanie wynika ze specyfikacji działania funckji include_once(). Wpis ku pamięci.

Ten wpis umieszczono w kategorii PHP, Programowanie. Możesz dodać go do zakładek permalink. Dodaj komentarz lub dodaj odpowiedź (trackback): Trackback URL.

Jeden Komentarz

  1. Mit
    Opublikowano 15 August, 2009 at 04:30 | Permalink

    Taaa, przerabiane na require_once ;)

Skomentuj

Twój adres email nie zostanie opublikowany i nie będzie rozpowszechniany. Wymagane pola są oznaczone *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>