2009-09-01 21 views
6

Esto no funciona:clase extendida no se encuentra cuando la clase base es separada en un archivo de inclusión

prueba.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'; 
} 

prueba 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'; 
} 

Da el siguiente error

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

que esto se entiende trabajar

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'; 
} 

¿Por qué poner la clase Base (Prueba1) en un archivo de inclusión causar la clase de niño que se está extendiendo a no encontrarse ? En otras palabras, el primer ejemplo está fallando porque no puede encontrar Test2 cuando intentamos instanciarlo. Esto tiene sentido ya que todavía no hemos llegado a Test2 en el flujo de ejecución del código. Sin embargo, en el segundo ejemplo (sin la instrucción include) no hay ningún error, aunque es una situación similar (todavía no hemos alcanzado la clase Test2 en la ejecución del código)

Ah, y esto es en la versión 5.1.6 .

ACTUALIZACIÓN:

OK, Daff es correcto - si muevo

$main = new mainClass(); 

hasta el final en el ejemplo prueba.php, funciona. Me gustaría saber por qué no funciona si la línea anterior no está al final; funciona bien en el ejemplo test2.php que no tiene la línea $ main = new mainClass() al final .

ACTUALIZACIÓN 2:

bien, He intentado usar require, require_onceinclude y en lugar de include_once - ninguno de estos trabajos. Y también agregué una declaración de prueba de eco en el archivo test-include.php y se imprime (además no obtengo un error sobre un archivo de inclusión inexistente) así que sé que la declaración de inclusión está funcionando.

+0

¿Estás seguro de que el include está funcionando? – Rufinus

+0

¿Cómo falla? ¿Error de compilación, error de ejecución, ningún error pero resultados incorrectos? – Lucky

+0

¿Qué ves si usas "requerir"? ¿Qué ves si pones "echo" Esto es test-include.php '; " al comienzo de "test-include.php"? ¿Está "test-include.php" en el mismo directorio? ¿Está en tu ruta de inclusión? – GZipp

Respuesta

6

Esto debería tener algo que ver con el orden de definición y que TODAS las clases deberían incluirse antes de trabajar con ellas. Si se pone la llamada de

$main = new mainClass(); 

Al final de la secuencia de comandos funciona correctamente incluso si el archivo de inclusión porque todas las clases están ya definidos. Finalmente, debería echarle un vistazo a la función PHP autoload porque eliminará estos problemas con una función pequeña.

+1

Creo que parte de la pregunta es que el orden de definición de clase es el mismo en ambos ejemplos, pero uno funciona y el otro no. –

+0

Sí, Alan está en lo correcto y modifiqué test2.php (y lo probé) para poner la clase base (Test1) en el mismo lugar que la instrucción include en test.php - test2.php todavía funciona en este caso, así que no es un problema de orden, a menos que PHP incluya, no funcione de la forma en que pensé (es decir, el código del archivo incluido se inserta donde estaba la declaración de inclusión). – Bill

+0

El orden de definición correcto es la mejor palabra para él. Todavía recomiendo cargar automáticamente o al menos incluir todos los archivos de clase antes de que comience cualquier procesamiento. – Daff

4

OK, creo que puedo haber descubierto esto.De acuerdo con este informe de error:

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

PHP 4 clases permitidas para ser definida después de que se utilizan, pero para PHP 5, en las palabras del cartel final en el hilo de errores:

PHP5 lo admite [declarando las clases después de que se utilizan] para la compatibilidad con versiones anteriores , pero no planeamos el soporte para todas las combinaciones.

Así que supongo que este caso particular es una de esas combinaciones no compatibles.

0

Primero use include_once() para agregar todos los archivos en su archivo de índice y cuando esté a punto de extender cualquier clase, instale primero esa clase padre.
Ejemplo:

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(){ 

    } 
    } 
?> 
Cuestiones relacionadas