__construct()vs与class同名的方法

时间:2010-08-12 20:24:35

标签: php

我最近开始使用php,并且想知道__construct()与具有与该类同名的方法之间的区别?

是否有理由使用它?我可以解决的是它是否覆盖了名为Foo的方法,还是取决于您喜欢的方法?

E.g。

class Foo {

    function Foo()
    {
       echo 'Foo stated<br>';
    }

    function __construct() {
       echo 'Construct started<br>';
    }
}

由于

5 个答案:

答案 0 :(得分:8)

使用__construct()是更新的PHP5更多以OOP为重点的方法来调用构造函数。使用与该类同名的方法是旧的弃用方法,它不会像PHP 5.3.3那样用作命名空间类的构造函数。

来自the constructors and destructors page

  

为了向后兼容,如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数。实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()的方法,该方法用于不同的语义。

     

与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成E_STRICT级错误消息。

     

从PHP 5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类。

答案 1 :(得分:7)

“如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数。实际上,它意味着唯一会出现兼容性问题的情况如果该类有一个名为__construct()的方法,它用于不同的语义。“

来源: http://www.php.net/manual/en/language.oop5.decon.php

答案 2 :(得分:3)

Foo()是一种php4方式(不推荐使用),__ construct()是php5方式。 php将首先查找__construct,然后,如果找不到它,它将使用Foo

答案 3 :(得分:3)

  

是否有理由使用它?我   可以解决它是否覆盖了   名为Foo的方法或者归结为   你更喜欢哪个?

当涉及重命名和继承时,__ construct()的好处变得更加清晰。如果重命名一个类,则必须重命名它的构造函数。没什么大不了的,但是如果B级继承自A级,你最终会得到:

class B extends A {
    function B() {
        parent::A();
    }
}

这样做更容易,更易于维护:

function __construct() {
    parent::__construct();
}

现在,当您重命名A类时,您不必记住也要更改其所有子级中的父级调用。当然,在代码中仍然需要重命名,但至少这不是其中之一。

答案 4 :(得分:0)

拥有一个与该类同名的方法,它自动被称为构造函数,这是对PHP4的回归,并且被认为已弃用...在PHP的最新开发分支中,它将被视为一个正常的方法。 __construct是PHP5中正式接受的构造函数,尽管在当前版本中,如果__construct不存在,它将回退到PHP4方法。