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 和 XML: 使用expat函数(三)
Oct 09 PHP
PHP简洁函数小结
Aug 12 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
php实现json编码的方法
Jul 30 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
Zend Framework处理Json数据方法详解
Dec 09 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 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批量更改数据库表前缀实现方法
2013/10/26 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
python 利用zmail库发送邮件
2020/09/11 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
Delphi工程师笔试题
2013/09/21 面试题
教师求职信
2014/06/17 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
语文教师个人工作总结
2015/02/06 职场文书
2016年元旦主持词
2015/07/06 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS