2009-08-03 2 views
12

Учитывая класс Foo с конструктором старого стиляВызов PHP Родительские Конструкторы со старым/новым синтаксисом

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

Есть ли функциональное различие между вызовом родительского конструктора с новым конструктором стиля или старого конструктора типа?

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

Другими словами, есть ли что-нибудь особенного вызова статического

parent::__construct() 

, когда он сделан из конструктора, или это просто стандартный статический вызов?

Перед тем, как начать практиковать Летающие обезьяны, я имею дело с некоторым устаревшим кодом и попыткой понять последствия всего, что происходит.

ответ

16

Я бы сказал, что оба синтаксиса делают то же самое ...
Редактировать: после написания остальной части ответа, на самом деле, это не совсем так. ^^ Это зависит от того, что вы заявляете; увидеть два примера:


Если вы определяете Foo как конструктор, и вызвать его с __construct, кажется, что он работает; следующий код:

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

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

$a = new Bar(); 

Выходы

string 'blah' (length=4) 

Таким образом, все нормально сейчас ;-)


С другой путь, если вы определяете __construct и вызвать Foo, как это :

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

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

$a = new Bar(); 

Это приведет к фатальной ошибке:

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

Итак, если ваш класс объявлен с использованием старого синтаксиса, вы можете назвать его в обоих направлениях; и если он определен с новым синтаксисом (PHP5), вы должны использовать этот новый синтаксис - что имеет смысл, Afterall :-)


Кстати, если вы хотите какой-то «реальное доказательство», вы можете попробовать использовать Vulcan Logic Disassembler, который предоставит вам коды операций, соответствующие скрипту PHP.


EDIT после комментария

Я загрузил выходы с помощью VLD с обоих синтаксисов: - vld-construct-new.txt: при объявлении __construct, и призывая __construct. - vld-construct-old.txt: при объявлении Foo и вызове __construct.

Выполнение различий между двумя файлами, это то, что я получаю:

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

(Unified Diff гораздо больше, так что я буду придерживаться, используя формат по умолчанию «дифф» здесь)

Таким образом, единственными отличиями в разобранных кодах операций являются имена функций; как в классе Foo, так и в классе Bar (который наследует метод __construct/Foo класса Foo).

То, что я бы на самом деле сказать:

  • Если вы сочинительство PHP 5 код (и, в 2009 году, я искренне надеюсь, что вы ^^), то просто использовать синтаксис __construct
  • вы вы должны поддерживать некоторые старые PHP 4 код не может мигрировать в PHP 5 (вы должны), то используйте синтаксис Foo ...


Как Замечание, the documentation says(цитирую):

Для обратной совместимости, если PHP 5 не может найти __construct() функцию для данного класса, он будет искать функцию конструктора старого стиля, по название класса.

Фактически, это означает, что только случая, который будет иметь совместимость проблемы, если класс был метод названного __construct(), который был использован для различных семантики.

Итак, я действительно считаю, что это не то, что большая часть разницы :-)


ли вы сталкиваетесь какой-то странной проблемой, что вы думаете, что вызвано чем-то, как разница между два синтаксиса?

+0

+1 С точки кода пути зрения, все, кажется, работает как задумано. То, что я не на 100% проясняю, это если есть какой-либо специальный контекст/область действия, которая продолжается, когда вы вызываете конструктор, который может отсутствовать при использовании более старого соглашения об именах конструктора –

Смежные вопросы