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 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
PHP学习之整理字符串
Apr 17 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php实现的mongoDB单例模式操作类
Jan 20 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
php文件包含的几种方式总结
Sep 19 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
第十四节 命名空间 [14]
2006/10/09 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python的移位操作实现详解
2019/08/21 Python
Python shelve模块实现解析
2019/08/28 Python
django 多数据库及分库实现方式
2020/04/01 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
Python: glob匹配文件的操作
2020/12/11 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
党员检讨书范文
2014/12/27 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
法制教育观后感
2015/06/17 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS