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 空格,换行,跳格使用说明
Dec 18 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
PHPCMS的使用小结
Sep 20 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
php自定义hash函数实例
May 05 PHP
PHP实现数组array转换成xml的方法
Jul 19 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP实现微信退款功能
Oct 02 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
vue组件实例解析
2017/01/10 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
javascript使用链接跨域下载图片
2019/11/01 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
使用python解析xml成对应的html示例分享
2014/04/02 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
使用python实现rsa算法代码
2016/02/17 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python实现从ftp服务器下载文件
2020/03/03 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
开学季活动策划方案
2014/02/28 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
爱国演讲稿400字
2014/05/07 职场文书
租房协议书
2014/09/12 职场文书
报名委托书
2015/01/29 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
详解MindSpore自定义模型损失函数
2021/06/30 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript