PHP中new static 的用法和new self 之间的区别

啥都不多说:

举个栗子:

class wangjh{
    /**
     * @return wangjh 实例化self
     */
    public function selfObj(){
        return new self();
    }

    /**
     * @return static 实例化static
     */
    public function staticObj(){
        return new static();
    }

    /**
     * @return string 获取被调用的类的名称
     */
    public function sayClass(){
        return get_called_class().'<br>';
    }
}

class extendWangjh extends wangjh{

}

class root extends extendWangjh{

}

$a = new wangjh();
$aObj = $a->selfObj();

$b = new wangjh();
$bObj = $b->staticObj();

$c = new extendWangjh();
$cObj = $c->selfObj();

$d = new extendWangjh();
$dObj = $d->staticObj();

var_dump($aObj == $bObj);    // true
var_dump($aObj == $cObj);    // true
var_dump($cObj == $dObj);    // false
var_dump($aObj == $dObj);    // false
//exit;

$com = new extendWangjh();
$x = $com->selfObj();
echo $x->sayClass();
// wangjh
$con = new extendWangjh();
$y = $con->staticObj();
echo $y->sayClass();
// extendWangjh
$mon = new root();
$z = $mon->selfObj();
echo $z->sayClass();
// wangjh
$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

先来看第一个true 

我们大致可以理解为 new self = new static ;

在来看第二个true 

我们理解为 在 extendWangjh 这个类中的 self 还是指向了子类,为什么呢?

不服 接着做测试 看下面这两段:

$mon = new root();
$z = $mon->selfObj();
echo $z->sayClass();
// wangjh
$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

在这里做测试竟然 new self 还是说调用了子类:

我们这里进行如下的超前总结: self 关键字永远都是指向 self所在的类中,也就是说,如果你在 A 类中使用了 self 关键字 那么在子类中,没有对其进行相关的操作(包括重新赋值,重新声明等),这个类永远指向的是 A 类!


下面 再看看 new static 是个什么东西

在第一 结果 true 中我们可以基本看出来当时 new static = new self 的

但是:

var_dump($cObj == $dObj);    // false

看这里 此时同一个对象的 new static != new self  他们竟然不相等了!

刚才已经理解过了 self 永远都是代码wangjh类的(因为 extendWangjh 和root 中都没有做任何的操作),莫非static 已经不再指向 wangjh 类了吗?接着看

var_dump($cObj instanceof extendWangjh); // false
var_dump($dObj instanceof extendWangjh); // true

这里说明在 extendWangjh 中的 new self 并不是wangjh类的实例化对象 但是 new static 却是! 这里更加验证了我们上面说的 new self 是代码了子类! 这里static 代表的是 extendWangjh ,这样的话,是不是说static 代表的是子类呢!


看这一段

$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

没错,好像可以基本确认了 static 是子类吧!

总结如下:

我们在实例化一个类的时候,self 是不会随着继承链传递的! static 则是可以随着继承链传递下去的!

你可能感兴趣的:(new,new,static,self)