PHP的new self() 与new static()
参考链接:【PHP中new static()与new self()的区别异同分析】,【PHP中new self()和new static()的区别探究】,【PHP中static和self的区别】
要点其实是理解概念:
还是看看老外的专业解释吧: self refers to the same class whose method the new operation takes place in.
译:self指那些方法被重写的类。tip:如果继承层次深(如继承深度大于1),当前子类没有重写父类方法,那么就需要找到最后一个方法被重写的类;如果是当前类重写的话,那当然就直接是当前类咯。 static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.
译:static指当你所调用的方法所在的类。tip:其实这个就不用管继承了,永远都是当前类,不用管父类。
一、只有一层继承:
看代码:
class Father {
public function getNewFather() {
return new self();
}
public function getNewCaller() {
return new static();
}
}
class Sun1 extends Father {
}
class Sun2 extends Father {
}
$sun1 = new Sun1();
$sun2 = new Sun2();
print '$sun1->getNewFather():'.get_class($sun1->getNewFather());
echo '<br>';
print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller());
echo '<br>';
print '$sun2->getNewFather():'.get_class($sun2->getNewFather());
echo '<br>';
print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller());
echo '<br>';
echo '<br>';
结果:
$sun1->getNewFather():Father
$sun1->getNewCaller():Sun1
$sun2->getNewFather():Father
$sun2->getNewCaller():Sun2
二、有两层继承
看代码:
class Father {
public function getNewFather() {
return new self();
}
public function getNewCaller() {
return new static();
}
}
class Sun1 extends Father {
public function getNewFather() {
return new self();
}
public function getNewCaller() {
return new static();
}
}
class Sun2 extends Father {}
class subSun1 extends Sun1{}
class subSub2 extends Sun2{}
$sun1 = new Sun1();
$sun2 = new Sun2();
$subSun1=new subSun1();
$subSub2=new subSub2();
print '$sun1->getNewFather():'.get_class($sun1->getNewFather());
echo '<br>';
print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller());
echo '<br>';
print '$sun2->getNewFather():'.get_class($sun2->getNewFather());
echo '<br>';
print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller());
echo '<br>';
echo '<br>';
print '$subSun1->getNewFather():'.get_class($subSun1->getNewFather());
echo '<br>';
print '$subSun1->getNewCaller():'.get_class($subSun1->getNewCaller());
echo '<br>';
print '$subSun2->getNewFather():'.get_class($subSub2->getNewFather());
echo '<br>';
print '$subSun2->getNewCaller():'.get_class($subSub2->getNewCaller());
结果:
$sun1->getNewFather():Sun1
$sun1->getNewCaller():Sun1
$sun2->getNewFather():Father
$sun2->getNewCaller():Sun2 $subSun1->getNewFather():Sun1
$subSun1->getNewCaller():subSun1
$subSun2->getNewFather():Father
$subSun2->getNewCaller():subSub2
PHP的new self() 与new static()的更多相关文章
- static,你还敢用吗?(二)
为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- static,你还敢用吗?
我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...
- Java关键字:static
通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...
- Android 中关于static的使用问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...
- iOS: 在UIViewController 中添加Static UITableView
如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- 今天思考一个问题,PHP const和static的区别
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...
随机推荐
- 《JAVA与模式》之建造模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...
- 微服务是"银弹"吗?
前言:所谓"银弹",本意是用金属银做成的子弹:在古老的传说里它是杀死狼人的有效武器.在著作<人月神话>也有描述.微服务是当前软件界流行的名词,那么它能成为像银弹一样厉害 ...
- 【pkuwc2018】 【loj2537】 Minmax DP+线段树合并
今年年初的时候参加了PKUWC,结果当时这一题想了快$2h$都没有想出来.... 哇我太菜啦.... 昨天突然去搜了下哪里有题,发现$loj$上有于是就去做了下. 结果第一题我5分钟就把所有细节都想好 ...
- 剑指offer二十八之数组中出现次数超过一半的数字
一.题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- Scrapy框架--cookie的获取/传递/本地保存
环境:Python3.6 + Scrapy1.4 我要实现的东西:1. 完成模拟登陆 2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中 3. ...
- Spring Boot的listener简单使用
监听器(Listener)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public ServletListene ...
- 给访问私有变量添加access method
class TestAccessPrivateVar{ private int a = 1; class MyInner{ /* synthetic final TestAccessPrivateVa ...
- 如何用 纯C++(ndk)开发安卓应用 ?
视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 如何安装安卓的开发环境以及怎么设置ndk的环境变量等在前边的文 ...
- mongodb与关系型数据库优缺点比较
1.与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度②文档结构的存储方式,能够更便捷的获取数据③内置GridFS,支持大容量的存储.④内置Sharding.⑤第 ...
- Windows 8.1 硬盘安装 Ubuntu14.04 双系统参考教程及注意事项
硬盘安装,无需光盘.U盘:Win8.1为主,Ubuntu14.04为辅,可将Windows或Ubuntu设置为开机默认启动项:在Ubuntu下可查看.操作Windows系统下的文件:适用于安装和14. ...