我正在尝试以下方法:
//file1.
namespace foo;
class mine {
public function mine() {
echo "Does not work!!";
}
}
//file2.
use foo/mine;
include "foo/mine.php";
$obj = new mine();
上述情况无效。包括文件构造函数在内的任何错误都不会被调用。
然而,当我使用__constructor()时,一切正常。我使用的是php v5.4
答案 0 :(得分:6)
来自php manual:
为了向后兼容,如果PHP 5找不到__construct() 给定类的函数,并且该类没有从a继承 父类,它将搜索旧式构造函数, 按类的名称。实际上,它意味着唯一的情况 如果类有一个方法,那就会出现兼容性问题 命名为__construct(),用于不同的语义。
从PHP 5.3.3开始,与a的最后一个元素同名的方法 命名空间的类名将不再被视为构造函数。这个 更改不会影响非命名空间的类。
你可以使用类的名称作为构造函数(除非该类是命名空间),因为PHP5保持这与PHP4的向后兼容性,但是这不是推荐的,因为它是旧的方式,可能会在较新版本的php中删除。因此,除非您正在编写需要PHP4兼容的内容,否则请使用__construct()
。
答案 1 :(得分:1)
以下是命名空间\构造函数问题的两种可能的解决方案
//parentclass.php
class parentclass
{
public function __construct()
{
//by default, strip the namespace from class name
//then attempt to call the constructor
call_user_func_array([$this,end(explode("\\",get_class($this)))],func_get_args());
}
}
//foo/bar.php
namespace foo;
class bar extends \parentclass
{
public function bar($qaz,$wsx)
{
//...
}
}
$abc = new foo\bar(1,2);
和
//parentclass.php
class parentclass
{
public function __construct()
{
//by default, replace the namespace separator (\) with an underscore (_)
//then attempt to call the constructor
call_user_func_array([$this,preg_replace("/\\/","_",get_class($this))],func_get_args());
}
}
//foo/bar.php
namespace foo;
class bar extends \parentclass
{
public function foo_bar($qaz,$wsx)
{
//...
}
}
$abc = new foo\bar(1,2);