PHP命名空间&构造函数问题

时间:2014-05-02 15:04:52

标签: php constructor namespaces

我正在尝试以下方法:

//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

2 个答案:

答案 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);