PHP中new static 的用法和new self 之间的区别
2016-03-25 00:00
357 查看
摘要: 最近在看yii框架的源码的时候发现底层有用到 new static(); 一下蒙逼了,只见过在单例中有“new self();”的写法还从来没有看到过new static()这样的写法!这个写法到底是干什么用的呢?
啥都不多说:
举个栗子:
先来看第一个true
我们大致可以理解为 new self = new static ;
在来看第二个true
我们理解为 在 extendWangjh 这个类中的 self 还是指向了子类,为什么呢?
不服 接着做测试 看下面这两段:
在这里做测试竟然 new self 还是说调用了子类:
我们这里进行如下的超前总结: self 关键字永远都是指向 self所在的类中,也就是说,如果你在 A 类中使用了 self 关键字 那么在子类中,没有对其进行相关的操作(包括重新赋值,重新声明等),这个类永远指向的是 A 类!
下面 再看看 new static 是个什么东西
在第一 结果 true 中我们可以基本看出来当时 new static = new self 的
但是:
看这里 此时同一个对象的 new static != new self 他们竟然不相等了!
刚才已经理解过了 self 永远都是代码wangjh类的(因为 extendWangjh 和root 中都没有做任何的操作),莫非static 已经不再指向 wangjh 类了吗?接着看
这里说明在 extendWangjh 中的 new self 并不是wangjh类的实例化对象 但是 new static 却是! 这里更加验证了我们上面说的 new self 是代码了子类! 这里static 代表的是 extendWangjh ,这样的话,是不是说static 代表的是子类呢!
看这一段
没错,好像可以基本确认了 static 是子类吧!
总结如下:
我们在实例化一个类的时候,self 是不会随着继承链传递的! static 则是可以随着继承链传递下去的!
更多源码,请访问 http://www.erdangjiade.com/source
网页特效下载:www.erdangjiade.com/js
更多PHP/Mysql功能:www.erdangjiade.com/php
更多原创模板,尽在 http://www.erdangjiade.com/templates
啥都不多说:
举个栗子:
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
相关文章推荐
- Ruby self在不同环境的含义
- 理解C#编程中的静态类和静态成员以及密封类
- some new eigrp feature
- .net(c#)中的new关键字详细介绍
- Rails Routes中new、collection、member的区别浅析
- C语言中static的作用及C语言中使用静态函数有何好处
- 从汇编看c++中函数里面的static关键字的使用说明
- C++的static关键字及变量存储位置总结
- C++中new与delete、malloc与free应用分析
- 基于C# 中可以new一个接口?的问题分析
- PHP中new static() 和 new self() 的区别介绍
- C#静态static的用法实例分析
- javascript中的self和this用法小结
- 全面解析C++中的new,operator new与placement new
- static关键字的作用详解
- 浅谈C/C++中的static与extern关键字的使用详解
- C语言基础知识点解析(extern,static,typedef,const)
- c# static 静态数据成员
- 浅析php变量修饰符static的使用
- python django - static文件处理与线上部署测试