2009-09-01 11 views
6

To nie działa:Rozszerzony klasa nie znaleziono, gdy klasa bazowa jest w oddzielnym pliku dołączanego

test.php:

include_once('test-include.php'); 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
    } 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

test-include.php:

// this does get printed out, so I know the include statement is working 
echo 'DEBUG: this is the test-include.php file<br>'; 

//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

Daje następujący błąd:

PHP Fatal error: Class 'Test2' not found in /path/to/test.php on line 8 

niniejsza działa

test2.php:

// this is in the same position as the include statement in test.php 
//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
} 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

Dlaczego oddanie klasy bazowej (Test1) w pliku dołączanego powodować klasa dziecko, które jest rozszerzenie go nie można znaleźć ? Innymi słowy, pierwszym przykładem jest błąd, ponieważ nie można znaleźć Test2, gdy próbujemy go utworzyć. Ten rodzaj ma sens, ponieważ nie dotarliśmy jeszcze do Test2 w procesie wykonywania kodu. Jednak w drugim przykładzie (bez instrukcji include) nie ma błędu, mimo że jest to podobna sytuacja (nie osiągnęliśmy jeszcze klasy Test2 w kodowaniu).

Och, i to jest w wersji 5.1.6 .

UPDATE:

OK, Daff jest poprawny - jeśli przeniosę

$main = new mainClass(); 

do końca w test.php przykład, to działa. Nadal chciałbym wiedzieć, dlaczego nie działa, jeśli powyższa linia nie jest na końcu - działa dobrze w przykładzie test2.php, który na końcu nie ma linii $ main = new mainClass() .

UPDATE 2:

OK, próbowałem za pomocą require, require_once i include zamiast include_once - żadna z tych prac. Dodałem także instrukcję test echo do pliku test-include.php i zostanie wydrukowany (plus nie dostaję błędu o nieistniejącym pliku włączającym), więc wiem, że instrukcja include działa.

+0

czy jesteś pewien, że załącznik działa? – Rufinus

+0

Jak to się nie udaje? Błąd kompilacji, błąd wykonania, brak błędu, ale błędne wyniki? – Lucky

+0

Co widzisz, jeśli używasz "wymagać"? Co widzisz, jeśli wstawisz "echo" To jest test-include.php ";" na początku "test-include.php"? Czy "test-include.php" znajduje się w tym samym katalogu? Czy jest na twojej ścieżce dołączania? – GZipp

Odpowiedz

6

To powinno mieć coś wspólnego z porządkiem definicji i że KAŻDY klasa powinna być zawarta przed faktyczną pracą z nimi. Jeśli zadzwonisz pod numer

$main = new mainClass(); 

Na końcu skryptu działa dobrze nawet z plikiem włączającym, ponieważ wszystkie klasy są już zdefiniowane. Ostatecznie powinieneś rzucić okiem na funkcję PHP autoload, ponieważ pozbędziesz się tych problemów za pomocą jednej małej funkcji.

+1

Myślę, że częścią tego pytania jest kolejność definicji klasy w obydwu przykładach, ale jedna działa, a druga nie. –

+0

Tak, Alan jest poprawny i zmodyfikowałem test2.php (i przetestowałem to), aby umieścić klasę podstawową (Test1) w tym samym miejscu co instrukcja include w pliku test.php - test2.php wciąż działa w tym przypadku, więc nie jest to problem z zamówieniem, chyba że PHP zawiera nie działa tak jak myślałem (tzn. kod z załączonego pliku jest wstawiany tam, gdzie znajdowała się instrukcja include). – Bill

+0

Kolejność Ok porządku jest lepszym słowem. Wciąż zalecam automatyczne ładowanie lub przynajmniej uwzględnianie wszystkich plików klas przed rozpoczęciem przetwarzania. – Daff

4

OK, myślę, że mogłem wymyślić ten jeden.Według tego raportu o błędzie:

http://bugs.php.net/bug.php?id=30453

PHP 4 dozwolony klas, które zostaną określone po są one używane, ale dla PHP 5, w słowach plakatu końcem na gwincie BŁĄD:

PHP5 obsługuje go [deklarując klasy po ich użyciu] dla kompatybilności wstecznej , ale nie planujemy obsługi dla wszystkich kombinacji.

Zgaduję, że ten konkretny przypadek jest jedną z tych nieobsługiwanych kombinacji.

0

Po raz pierwszy użyj , aby dodać wszystkie pliki w pliku indeksu, a gdy chcesz rozszerzyć dowolną klasę, stwórz najpierw tę klasę nadrzędną.
Przykład:

index.php--> 
<?php 
    include_once('parentClass.php'); 
    include_once('childClass.php'); 

    $parentObj = new parent(); 
    $childObj = new child(); 
?> 

child.php--> 
<?php 
    class child extends parent{ 
    function __construct(){ 

    } 
    } 
?> 
Powiązane problemy