Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: require_once
Forum PHP.pl > Forum > PHP
Athlan
Witam.

Ostatnio natrafiłem na bardzo dziwny problem. Jak programuję kilka lat, tak to mnie zbiło z nóg. Mianowicie, za każdym razem uruchamiany jest plik index.php, który robi require_once Vframe.Class.php, który zawiera deklarację klasy Vframe.

W losowych zupełnie przypadkach dla tych samych danych wejściowych requestu dostaję informację, że nie można redeklarować klasy Vframe. Co dziwne:
  • klasa nie jest deklarowana nigdzie indziej, niż w pliku Vframe.Class.php
  • plik Vframe.Class.php jest dołączany require_once tylko w pliku index.php
  • nie ma innych require/include (bez once) w dalszej części kodu


Nie mam zielonego pojęcia, co może być nie tak. Wycieki pamięci? PHP Version 5.2.5 (x64), serwer IIS7.
krzotr
To może sprawdź gdzie dokładnie znajduje się ta klasa ?

Na początku pliku Vframe.Class.php dodaj

  1. <?php
  2.  
  3. if( class_exists( 'Vframe', FALSE ) )
  4. {
  5. $class = new ReflectionClass( 'Vframe' );
  6.  
  7. die( $class -> getFileName() );
  8. }
Athlan
Wskazało plik Vframe.Class.php.

Zrobiłem dalsze testy, wsadziłem coś takiego:

  1. if(class_exists( 'Vframe', FALSE ) )
  2. {
  3. $class = new ReflectionClass( 'Vframe' );
  4. die( $class -> getFileName() );
  5. }
  6. else
  7. echo 'allright';


Niestety, przy próbie załączenia pliku Vframe.Class.php wyskakuje ścieżka z die(). Jeżeli klasa by była już zadeklarowana, przynajmniej raz bym otrzymał na ekranie napis allright. Niestety się tak nie dzieje. Co więcej, po wyrzuceniu require_once z index.php dalsza część kodu wyrzuca informacje, że nie ma zdefiniowanej klasy Vframe.

Oznaczałoby to, że plik Vframe.Class.php wykonuje samego siebie jeszcze raz, skoro nigdzie indziej nie ma deklaracji tej klasy. Niestety, nie może się to stać, bo w tym przypadku również bym otrzymał przynajmniej raz napis allright.

Wykonałem dodatkowy test, zmieniłem nazwę klasy na VframeB, zeby przetestować ewentualne powiązania autoloadu z nazwą pliku. Nazwę zmieniłem również w przeklejonym wyżej kodzie testującym, okazało się, że problem jest ten sam! o.O
wookieb
Wstaw sobie na początku tego pliku
http://pl2.php.net/manual/pl/function.debu...t-backtrace.php
to będziesz wiedział kto i gdzie includuje drugi raz twoją klasę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.