2009-08-03 11 views
12

Dada la clase Foo con un constructor de estilo antiguoCalling constructores padres PHP con la vieja/nueva sintaxis

class Foo 
{ 
    public function Foo() 
    { 
     //does constructing stuff 
    } 
} 

¿Hay alguna diferencia funcional entre una llamada al constructor padre con un nuevo constructor de estilo o el viejo constructor de estilo?

class Bar extends Foo 
{ 
    public function Bar() 
    { 
     //does it matter? 
     //parent::__construct(); 
     //parent::Foo(); 
    } 
} 

Dicho de otra manera, ¿hay algo especial acerca de la llamada estática

parent::__construct() 

cuando está hecho de un constructor, o es sólo una llamada estática estándar?

Antes de descender las Best Practices Flying Monkeys, estoy tratando con algún código heredado y tratando de entender las consecuencias de todo lo que está sucediendo.

Respuesta

16

Yo diría que ambas sintaxis hacen exactamente lo mismo ...
Editar: después de escribir el resto de la respuesta, en realidad, esto no es del todo cierto ^^ Depende de lo que declare; ver las dos ejemplos:


Si define Foo como constructor, y llamarlo con __construct, parece que está funcionando; el siguiente código:

class Foo { 
    public function Foo() { 
     var_dump('blah'); 
    } 
} 

class Bar extends Foo { 
    public function Bar() { 
     parent::__construct(); 
    } 
} 

$a = new Bar(); 

salidas

string 'blah' (length=4) 

lo tanto, todo bien por ahora ;-)


Por otro lado, si se define __construct, y llama Foo, como este :

class Foo { 
    public function __construct() { 
     var_dump('blah'); 
    } 
} 

class Bar extends Foo { 
    public function Bar() { 
     parent::Foo(); 
    } 
} 

$a = new Bar(); 

Te conseguirá un error fatal:

Fatal error: Call to undefined method Foo::foo() 

Por lo tanto, si su clase se declara con sintaxis antigua, puede llamarla de ambas formas; y si se define con una nueva sintaxis (PHP5), debe usar esa nueva sintaxis - lo cual tiene sentido, después de todo :-)


Por cierto, si quieres algún tipo de "prueba real", puede probar a usar el Vulcan Logic Disassembler, que le dará los códigos de operación correspondientes a un script PHP.


EDITAR después del comentario

He subido las salidas de la utilización de VLD con las dos sintaxis: - vld-construct-new.txt: cuando se declara __construct, y llamando __construct. - vld-construct-old.txt: al declarar Foo y al invocar __construct.

haciendo diferencias entre los dos archivos, esto es lo que me sale:

$ diff vld-construct-old.txt vld-construct-new.txt 
25c25 
< Function foo: 
--- 
> Function __construct: 
29c29 
< function name: Foo 
--- 
> function name: __construct 
44c44 
< End of function foo. 
--- 
> End of function __construct. 
71c71 
< Function foo: 
--- 
> Function __construct: 
75c75 
< function name: Foo 
--- 
> function name: __construct 
90c90 
< End of function foo. 
--- 
> End of function __construct. 

(Diff unificado es mucho más largo, así que me quedo a utilizar el formato por defecto de "diff" aquí)

Por lo tanto, las únicas diferencias en los códigos de operación desmontados son los nombres de las funciones; tanto en la clase Foo como en la clase Bar (que hereda el método __construct/Foo de la clase Foo).

Lo que realmente me es decir:

  • Si la escritura de código PHP 5 (y, en 2009, espero sinceramente que haces ^^), a continuación, sólo tiene que utilizar la sintaxis __construct
  • usted tiene que mantener algún antiguo código PHP 4 no puede migrar a PHP 5 (debería), a continuación, utilizar la sintaxis de Foo ...


A medida que la anotación al margen, the documentation says(citando):

Para compatibilidad hacia atrás, si PHP 5 no puede encontrar una función __construct() para una clase dada, se buscará la función constructora de estilo antiguo, por el nombre de la clase.

Efectivamente, esto significa que la única caso que tendría compatibilidad cuestiones es si la clase tiene un método llamado __construct() que fue utilizado para semántica diferente.

Así que, realmente creo que no hay que gran parte de la diferencia :-)


¿Encontró algún tipo de problema extraño, que cree que es causada por algo así como una diferencia entre las dos sintaxis?

+0

1 Desde un punto de vista todo ruta de código parece funcionar según lo previsto. Lo que no tengo claro al 100% es si hay un contexto/alcance especial que se produce cuando llamas a un constructor que podría faltar cuando usas la convención de nomenclatura de constructor anterior. –