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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
一个程序下载的管理程序(三)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
php读取xml实例代码
Jan 28 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
PHP操作MongoDB时的整数问题及对策说明
May 02 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
PHP实现的浏览器检查类
Apr 11 PHP
php中namespace及use用法分析
Dec 06 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
ExtJs的Date格式字符代码
2010/12/30 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python实现的简单抽奖系统实例
2015/05/22 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
python求绝对值的三种方法小结
2019/12/04 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
市政管理求职信范文
2014/05/07 职场文书
人事主管岗位职责
2015/02/04 职场文书
以权谋私检举信范文
2015/03/02 职场文书
专家推荐信怎么写
2015/03/25 职场文书
感恩教师主题班会
2015/08/12 职场文书
建议书的格式及范文
2015/09/14 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android