Вызов родительских конструкторов PHP со старым / новым синтаксисом - PullRequest
12 голосов
/ 03 августа 2009

Учитывая класс Foo с конструктором в старом стиле

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

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

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

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

parent::__construct()

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

Перед тем как спуститься Best Practices Flying Monkeys, я имею дело с неким устаревшим кодом и пытаюсь понять последствия всего, что происходит.

Ответы [ 2 ]

16 голосов
/ 03 августа 2009

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


Если вы определяете 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() который был использован для разной семантики.

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


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

1 голос
/ 06 марта 2012

Начиная с PHP 5.3.3, старый стиль ctor не будет работать при использовании пространств имен.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...