有哪些新方法可以创建新对象?

时间:2015-04-10 12:37:27

标签: php

我正在使用NetBeans编辑器。在下面的代码中,没有错误,但我对某些事感到困惑:为什么我们return new static

class test {
     static public function getnew(){
          return new static;
     }
}
class child extends test {}

$obj1 = new test ();
$obj2 = new $obj1;
var_dump($obj1!==$obj2);
$obj3 = test::getnew();
var_dump($obj3 instanceof test);
$obj4 = child::getnew();
var_dump($obj4 instanceof child );

结果输出:

boolean true  
boolean true  
boolean true

那么return new static在这做什么?

2 个答案:

答案 0 :(得分:1)

这是PHP {5.3}中引入的Late Static Bindings的一部分。

基本上,static关键字将在运行时被当前类替换。因此,在child的情况下,它将评估为:

static public function getnew(){
    return new child;
}

使用__CLASS__self的问题是它们会在编译时被替换。因此,如果您要执行new self;,它们将始终返回test类的实例(其中定义了getnew()函数),即使在子类上调用该方法也是如此。 static关键字可以防止这种情况发生。

想要使用它的主要原因是你不必在每个子类中覆盖getnew

答案 1 :(得分:0)

return new static;

实例化课程" test"与后期静态绑定。所以当你扩展课程时,测试"这将为您提供扩展类的实例。将它用作静态工厂方法非常方便。