Я бы сказал, что оба синтаксиса делают то же самое ...
Редактировать: после написания остальной части ответа, на самом деле, это не совсем так. ^^ Это зависит от того, что вы заявляете; увидеть два примера:
Если вы определяете 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()
, который был использован для различных семантики.
Итак, я действительно считаю, что это не то, что большая часть разницы :-)
ли вы сталкиваетесь какой-то странной проблемой, что вы думаете, что вызвано чем-то, как разница между два синтаксиса?
+1 С точки кода пути зрения, все, кажется, работает как задумано. То, что я не на 100% проясняю, это если есть какой-либо специальный контекст/область действия, которая продолжается, когда вы вызываете конструктор, который может отсутствовать при использовании более старого соглашения об именах конструктора –