使用旧/新语法调用PHP父构造函数

Ala*_*orm 12 php oop constructor

给定Foo类具有旧式构造函数

class Foo
{
    public function Foo()
    {
        //does constructing stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

使用新样式构造函数或旧样式构造函数调用父构造函数之间是否存在任何功能差异?

class Bar extends Foo
{
    public function Bar()
    {
        //does it matter?
        //parent::__construct();
        //parent::Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,静态调用有什么特别之处

parent::__construct()
Run Code Online (Sandbox Code Playgroud)

当它是由构造函数构成的,还是仅仅是标准的静态调用?

在最佳实践飞行猴子下降之前,我正在处理一些遗留代码,并试图了解正在发生的一切的后果.

Pas*_*TIN 16

我会说这两种语法完全相同...
编辑:写完其余的答案之后,实际上,这并不完全正确^^这取决于你声明的内容; 看两个例子:


如果你定义Foo为构造函数,并调用它__construct,它似乎正在工作; 以下代码:

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

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

$a = new Bar();
Run Code Online (Sandbox Code Playgroud)

输出

string 'blah' (length=4)
Run Code Online (Sandbox Code Playgroud)

所以,现在一切都好;-)


另一方面,如果你定义__construct,并调用Foo,如下所示:

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

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

$a = new Bar();
Run Code Online (Sandbox Code Playgroud)

它会给你一个致命错误:

Fatal error: Call to undefined method Foo::foo()
Run Code Online (Sandbox Code Playgroud)

因此,如果您的类使用旧语法声明,则可以双向调用它; 如果它是用新的(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.
Run Code Online (Sandbox Code Playgroud)

(统一差异更长,所以我会坚持使用默认格式"差异"这里)

因此,反汇编操作码的唯一区别是函数的名称; 在Foo类和Bar类中(继承类的__construct/ Foo方法Foo).

我真正要说的是:

  • 如果你正在编写PHP 5代码(并且,在2009年,我真诚地希望你做^^),那么,只需使用__construct语法
  • 您必须维护一些旧的PHP 4代码,您无法迁移到PHP 5 (您应该),然后,使用Foo语法...


作为旁注,文件说 (引用):

为了向后兼容,如果PHP 5找不到__construct()给定类的函数,它将按类的名称搜索旧式构造函数.

实际上,这意味着唯一具有兼容性问题的情况是,如果该类具有一个名为的方法__construct(),该方法用于不同的语义.

所以,我真的认为没有那么大的区别:-)


您是否遇到过某种奇怪的问题,您认为这是由两种语法之间的区别引起的?