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 include加载文件两种方式效率比较
Aug 08 PHP
PHP变量赋值、代入给JavaScript中的变量
Jun 29 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
Sep 07 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
Apr 05 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 PHP
PHP底层运行机制与工作原理详解
Jul 31 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
咖啡常见的种类
2021/03/03 新手入门
ADODB的数据库封包程序库
2006/12/31 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
10个php函数实用却不常见
2015/10/13 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
js实现网页随机验证码
2020/10/19 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
python发送邮件接收邮件示例分享
2014/01/21 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
医学毕业生自荐信
2013/10/11 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2015年女生节活动总结
2015/02/27 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
导游词之南京夫子庙
2019/12/09 职场文书