本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助。

问题的起因是本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,要求更改在5.2下能运行。

改着改着发现了一个地方

return new static($val);

这尼玛是神马,只见过

return new self($val);

于是上网查了下,他们两个的区别。

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

这个例子基本上一看就懂了吧。

原理了解了,但是问题还没有解决,如何解决掉 return new static($val); 这个问题呢?

其实也简单就是用 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"

*/

感兴趣的朋友可以动手测试一下示例代码,相信会有新的收获!

php new static,PHP中new static()与new self()的区别异同分析相关推荐

  1. php中的static,php中的static

    类的方法和属性都是可以用static来声明的,下面举几个例子 class    one(){ public static $para = "1"; public static me ...

  2. c#中窗体的close、dispose的区别及分析

    一个小程序,初始运行正常,当实际使用时,突然发现程序运行一段时间后,会自动的弹出一个系统中的messagebox.我想当然的认为是病毒在作怪吗?把程序安装到其他电脑上,故障依然,可以肯定是代码的事了. ...

  3. Vue实例中生命周期created和mounted的区别(具体细节分析)。

    最近刚好在学习Vue.js,在实敲轮播demo时发现了一个当时感觉很奇怪的问题: 初始化使用mounted钩子时,只调用了一次,之后就没有调用过了.害我一直以为是自己之后的代码书写有问题,结果自己再敲 ...

  4. pid算法中位置型和增量型有什么区别,分析两者优缺点

    关于P.I.D三个环节的选择,一般只会用到PI控制或者PD控制,例如速度控制要求稳态无误差,那么就需要积分环节,所以使用PI控制:而使用方向控制的时候,由于不需要无稳态误差,所以使用PD控制即可,D的 ...

  5. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

  6. C/C++中inline/static inline/extern inline的区别及使用

    引入内联函数的目的是为了解决程序中函数调用的效率问题,也是用内联函数取代带参宏定义(函数传参比宏更加方便易用) inline关键字用来定义一个类的内联函数. 在类体中和类体外定义成员函数是有区别的:在 ...

  7. 浅谈C/C++中的static和extern关键字

    一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...

  8. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

  9. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

最新文章

  1. STM32固件库的调用
  2. python编程100例画图-python 画图示例源码(Turtle Graphics)
  3. 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  4. 【小练习04】HTML+CSS--医药健康小页面
  5. python 读取excel表格_python 对Excel表格的读取
  6. 从张量积(tensor product)到多重线性代数(multilinear algebra)
  7. 具体数学-第10课(素数和阶乘的有趣性质)
  8. 项目中的每个层的理念是什么?
  9. 网络中把提供服务的计算机称为,网络第三套试题
  10. java音量调节_音量控制setVolumeControlStream
  11. 洛谷在线测试P1878_舞蹈课
  12. 美术文献杂志美术文献杂志社美术文献编辑部2022年第7期目录
  13. java set方法_Set的常用方法(java)
  14. 【开发工具】 我居然可以使用Office Tool Plus 安装上Office 真的是太不可思议了
  15. 五子棋游戏程序设计制作(C语言)
  16. Golden Gate
  17. 数据湖常用查询优化技术
  18. 有赞基于Flutter的移动端跨平台App架构实践
  19. 【OpenCV-Python】5.OpenCV的图形用户界面窗口控制
  20. 亲测解决谷歌chrome浏览器的“此Flash Player与您的地区不相容,请重新安装Flash”

热门文章

  1. virtualbox虚拟机上安装centOS的网络配置(安装centos时选择桥接网络)
  2. 把.NET程序部署到没有安装.NET Framwork的机器上
  3. 3. 逻辑漏洞之支付漏洞
  4. eclipse同步svn时如何过滤target等文件
  5. Problem C: 爬楼梯
  6. Flex RIA的ArcIMS WebGIS之路(一)--胸中的那棵竹
  7. windows下安装node版本管理工具及nvm use切换不成功问题解决
  8. Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题
  9. 华为2021数字化转型报告:从战略到执行.pdf(附103页pdf下载链接)
  10. 【干货】神策数据朱德康:用户中台建设实践解析(附PPT下载链接)