Chamando os Construtores pai do PHP com syntax antiga / nova

Dada a class Foo com um construtor de estilo antigo

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

Existe alguma diferença funcional entre chamar o construtor pai com um novo construtor de estilo ou o construtor de estilo antigo?

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

Dito de outra forma, existe algo especial sobre a chamada estática

 parent::__construct() 

quando é feito de um construtor, ou é apenas uma chamada estática padrão?

Antes que os Best Practices Flying Monkeys descem, estou lidando com algum código legado e tentando entender as conseqüências de tudo o que está acontecendo.

Eu diria que a syntax faz exatamente o mesmo …
Editar: depois de escrever o resto da resposta, na verdade, isso não é inteiramente verdadeiro ^^ depende do que você declara; veja os dois exemplos:

Se você definir Foo como construtor e chamá-lo com __construct , parece que está funcionando; o seguinte código:

 class Foo { public function Foo() { var_dump('blah'); } } class Bar extends Foo { public function Bar() { parent::__construct(); } } $a = new Bar(); 

Saídas

 string 'blah' (length=4) 

Então tudo bem por enquanto 😉

Por outro lado, se você definir __construct e chamar Foo, assim:

 class Foo { public function __construct() { var_dump('blah'); } } class Bar extends Foo { public function Bar() { parent::Foo(); } } $a = new Bar(); 

Isso lhe dará um erro fatal:

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

Então, se sua class for declarada com syntax antiga, você pode chamar ambas as duas maneiras; e se for definido com nova syntax (PHP5), você deve usar essa nova syntax – o que faz sentido, depois de tudo 🙂

BTW, se você quiser algum tipo de “prova real”, você pode tentar usar o Vulcan Logic Disassembler , que lhe dará os códigos opcionais correspondentes a um script PHP.


EDITAR após o comentário

Carreguei as saídas de usar o VLD com ambas as syntaxs: – vld-construct-new.txt : ao declarar __construct e chamar __construct. – vld-construct-old.txt : ao declarar Foo, e chamando __construct.

Fazendo um diferencial entre os dois arquivos, é isso que eu recebo:

 $ 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. 

(O diff unificado é muito mais longo, então fico usando o formato padrão de “diff” aqui)

Assim, as únicas diferenças nos opcodes desmontados são os nomes das funções; tanto na class Foo quanto na class Bar (que herda o método __construct / Foo da class Foo ).

O que eu realmente diria é:

  • Se você está escrevendo o código PHP 5 (e, em 2009, sinceramente espero que você faça ^^) , então use apenas a syntax __construct
  • Você deve manter algum código antigo do PHP 4 que não pode migrar para o PHP 5 (você deve) , então use a syntax Foo …

Como o sidenote, a documentação diz (citando) :

Para compatibilidade com versões anteriores, se o PHP 5 não conseguir uma function __construct() para uma determinada class, ele procurará a function de construtor de estilo antigo, pelo nome da class.

Efetivamente, isso significa que o único caso que teria problemas de compatibilidade é se a class tivesse um método chamado __construct() que fosse usado para diferentes semânticas.

Então, eu realmente acho que não há muita diferença 🙂

Você encontrou algum tipo de problema estranho, que você acha que é causado por algo como uma diferença entre as duas syntaxs?

A partir do PHP 5.3.3, o ctor de estilo antigo não funcionará quando estiver usando namespaces.

Veja http://www.php.net/archive/2010.php#id2010-07-22-2