PHP中 new self() 和 new static() 的区别和相同点
2018-05-21| 程成| 969| 0| PHP技术

在类初始化中,看到了这样一个方法:new self()。上网查了下后,发现有个与它含义类似的方法:new static()。不过,这两个方法还是有区别的。


public static function initClass(){
        return new self();
}


self:就是这个类,是代码段里面的这个类。

static:PHP 5.3新增,类似于 $this,访问的是当前实例化那个类,那 static 就是那个类。



下面是官方解释:

self refers to the same class whose method the new operation takes place in.


static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.


In the following example, B inherits both methods from A. self is bound to A because it's defined in A's implementation of the first method, whereas static is bound to the called class (also see  get_called_class() ).


class A {
  public static function get_self() {
    return new self();
  }
 
  public static function get_static() {
    return new static();
  }
}
 
class B extends A {}
 
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A


现在你大概已经了解了 new self()new static() 方法的异同了。

它们两个只有在继承中才有区别,如果没有任何继承,那么它们是没有区别的。

首先,new self() 返回值是万年不变的,不管谁去调用它,它始终返回同一个类的实例;但是 new static() 是由调用者决定的。



注:如何解决 new static() 不兼容 PHP 5.3 以下版本问题?

答:使用 get_class($this) 即可,代码如下:


class A {
  public function create1() {
    $class = get_class($this);
    return new $class();
  }
  public function create2() {
    return new static();
  }
}
 
class B extends A {
 
}
 
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
 
/*
The result 
string(1) "B"
string(1) "B"
*/


这样你就可以巧妙的将 new staic() 兼容了 PHP5.3 以下的版本。

相信你也大致了解了 new self()new static() 的区别了吧。




×
作者:程成
QQ:492245711