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 相关文章推荐
echo(),print(),print_r()之间的区别?
Nov 19 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
php daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
Nov 03 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
php写入文件不覆盖的实例讲解
Sep 17 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 MsSql server时遇到的中文编码问题
2009/06/11 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
mouse_on_title.js
2006/08/25 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
Python迭代器定义与简单用法分析
2018/04/30 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Python 忽略文件名编码的方法
2020/08/01 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
护理职业生涯规划书
2014/01/24 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
学习心理学的体会
2014/11/07 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫