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 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
深入解析php中的foreach函数
Aug 31 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP数据库操作四:mongodb用法分析
Aug 16 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 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
一个odbc连mssql分页的类
2006/10/09 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
php简单生成随机数的方法
2015/07/30 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
python2.7实现邮件发送功能
2018/12/12 Python
python实现加密的方式总结
2020/01/19 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
机电工程学生自荐信范文
2013/12/07 职场文书
公司担保书范文
2014/05/21 职场文书
六年级学生期末评语
2014/12/26 职场文书