Я бы сказал, что оба синтаксиса делают одно и то же ...
Изменить: после написания остальной части ответа, на самом деле, это не совсем верно ^^ Это зависит от того, что вы объявляете; см. два примера:
Если вы определяете 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) синтаксисом, вы должны использовать этот новый синтаксис - что имеет смысл, в конце концов: -)
Кстати, если вам нужно какое-то «реальное доказательство», вы можете попробовать использовать Vulcan Logic Disassembler , который даст вам коды операций, соответствующие сценарию PHP.
РЕДАКТИРОВАТЬ после комментария
Я загрузил результаты использования 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.
(Унифицированный diff намного длиннее, поэтому я остановлюсь на использовании формата по умолчанию "diff")
Итак, единственными отличиями в разобранных кодах операций являются названия функций; как в классе Foo
, так и в классе Bar
(который наследует метод __construct
/ Foo
класса Foo
).
Что бы я на самом деле сказал:
- Если вы пишете код PHP 5 (а в 2009 году я искренне надеюсь, что вы это сделаете ^^) , тогда просто используйте синтаксис __construct
- Вы должны поддерживать какой-то старый код PHP 4, который вы не можете перенести в PHP 5 (вам следует) , затем использовать синтаксис Foo ...
Как примечание, документация гласит (цитирование) :
Для обратной совместимости, если PHP 5
не могу найти __construct()
функцию
для данного класса, он будет искать
функция конструктора старого стиля,
Название класса.
По сути, это означает, что единственный
случай, который будет иметь совместимость
вопросы, если у класса был метод
названный __construct()
который был использован
для разной семантики.
Итак, я действительно думаю, что нет большой разницы : -)
Сталкивались ли вы с какой-то странной проблемой, которая, по вашему мнению, вызвана чем-то вроде различия между двумя синтаксисами?