如何防止PHP考虑函数,与类同名,构造函数


How to prevent PHP from considering the functions, with the same name of a class, a constructor

PHP 5.3.3版本

class Same {
    public function same() { echo 'Not good'; } 
}
$c = new Same();

将输出Not good。从5.3.3+开始,它将不再输出字符串。这是因为在PHP 5.3.3中,与类同名的函数不被认为是构造函数。如何在PHP 5.3.2或更早版本中强制执行此行为?

最简单的方法可能就是创建一个空构造函数:

class Same {
    public function same() { echo 'Not good'; } 
    public function __construct() { }
}
$c = new Same();

这将不会返回"Not good",因为__construct()方法覆盖了"与类同名"方法。

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

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

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

文档:http://php.net/manual/en/language.oop5.decon.php

所以显而易见的解决方案是声明一个__constructors方法(即使是空的)

构造方法命名为__construct()。如果你希望有相同的名称,只需在__construct()中调用相同的()方法。
根据http://php.net/construct, php尝试保留向后兼容性。在我看来,"相同"的名字意味着写方法名区分大小写(作为类名)。