啥都不多说:
举个栗子:
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 则是可以随着继承链传递下去的!
更多源码,请访问 http://www.erdangjiade.com/source
网页特效下载:www.erdangjiade.com/js
更多PHP/Mysql功能:www.erdangjiade.com/php
更多原创模板,尽在 http://www.erdangjiade.com/templates
来源:oschina
链接:https://my.oschina.net/u/1996208/blog/647127