PHP面向对象中new self()与 new static()的区别浅析


Posted in PHP onAugust 17, 2017

前言

本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧。

区别如下:

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

接下来通过一个例子来证明上面的结果

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo self::$_a . PHP_EOL;
 }
}

class B extends A 
{
 public static $_a = 'Class B';
}

$obj = new B();
B::echoProperty();//输出 Class A

之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo static::$_a . PHP_EOL;
 }
}
//再次调用B::echoProperty将输出 'CLASS B'

为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。

下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)

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_self()); // A
echo get_class(A::get_static()); // A

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP-MySQL教程归纳总结
Jun 07 PHP
PHP之COOKIE支持详解
Sep 20 PHP
深入PHP autoload机制的详解
Jun 09 PHP
利用PHP+JS实现搜索自动提示(实例)
Jun 09 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
php图片添加水印例子
Jul 20 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP fclose函数用法总结
Feb 15 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 PHP
Laravel Reponse响应客户端示例详解
Sep 03 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 #PHP
PHP实现执行外部程序的方法详解
Aug 17 #PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 #PHP
Laravel中的Auth模块详解
Aug 17 #PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 #PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 #PHP
PHP编译configure时常见错误的总结
Aug 17 #PHP
You might like
用Php实现链结人气统计
2006/10/09 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
使用Template格式化Python字符串的方法
2019/01/22 Python
python打包成so文件过程解析
2019/09/28 Python
C#面试题
2016/05/06 面试题
数学专业毕业生自荐信
2013/11/10 职场文书
个人思想理论学习的自我鉴定
2013/11/30 职场文书
保护环境建议书100字
2014/05/13 职场文书
体育活动总结
2015/02/04 职场文书
广告业务员岗位职责
2015/02/13 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python