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获取某个目录大小的代码
Sep 10 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
php按单词截取字符串的方法
Apr 07 PHP
PHP 错误处理机制
Jul 06 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
PHP读书笔记整理_结构语句详解
Jul 01 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 PHP
PHP CURL中传递cookie的方法步骤
May 09 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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 和 MySQL 基础教程(四)
2006/10/09 PHP
PHP脚本数据库功能详解(中)
2006/10/09 PHP
php无序树实现方法
2015/07/28 PHP
10个php函数实用却不常见
2015/10/13 PHP
深入理解PHP内核(一)
2015/11/10 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
python 读写txt文件 json文件的实现方法
2016/10/22 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python3 操作符重载方法示例
2017/11/23 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
高一学生评语大全
2014/04/25 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
办护照工作证明
2014/10/01 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
三好学生竞选稿
2015/11/21 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python