啥都很少说:php
举个栗子:sql
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 ;spa
在来看第二个true code
咱们理解为 在 extendWangjh 这个类中的 self 仍是指向了子类,为何呢?对象
不服 接着作测试 看下面这两段:继承
$mon = new root(); $z = $mon->selfObj(); echo $z->sayClass(); // wangjh
$mon = new root(); $c = $mon->staticObj(); echo $c->sayClass(); // root
在这里作测试居然 new self 仍是说调用了子类:get
咱们这里进行以下的超前总结: self 关键字永远都是指向 self所在的类中,也就是说,若是你在 A 类中使用了 self 关键字 那么在子类中,没有对其进行相关的操做(包括从新赋值,从新声明等),这个类永远指向的是 A 类!源码
下面 再看看 new static 是个什么东西string
在第一 结果 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