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后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...
随机推荐
- 【BZOJ3456】轩辕朗的城市规划 EGF+多项式求ln
我们构造$f(i)$和$g(i)$. 其中$f(x)$表示由$x$个节点构成的无向简单连通图的个数. $g(x)$表示有$x$个节点构成的无向简单图(不要求连通)的个数. 显然,由$x$个节点构成的无 ...
- jq03--基础函数
我们继续学习jq的一些函数,包括向jq对象添加.删除CSS属性以及遍历DOM树. 1.获取.设置CSS类 addClass()--向被选元素添加1个或多个类属性 .importance{font-we ...
- linux下安装mysql-5.7.20
1.下载地址 https://downloads.mysql.com/archives/community/ 2.安装步骤 解压: groupadd mysql useradd -r -g mysql ...
- Android 开发工具类 24_getHtml
获取网页(JSP)源码 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; impo ...
- Kubernetes中的垃圾回收机制
本文所讨论垃圾回收(GC,Garbage Collection)机制针对Kubernetes1.1.7,docker容器. 一.Tips 01. Kubernetes的垃圾回收由kubelet进行管理 ...
- Spring Boot 的彩色日志
springboot的彩色日志灰常漂亮, 看起来也很舒服. 但是自定义的日志就是一纯白色的, 丑到不行. 所以就copy他的彩色日志来养眼: <!-- 彩色日志 --> <!-- 彩 ...
- free -m内存使用详解
第一部分Mem这行:total -> 内存总数: 32014M=32Gused -> 已经使用的内存数: 7665Mfree -> 空闲的内存数: 24349Mshared -> ...
- android即时通信开源项目信息
源码提供!Android即时通讯和sns开源项目汇总 http://www.jianshu.com/p/b2ca52337fe5
- Windows 查看程序占用的端口
一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知 ...
- SpringMVC form 表单提交报400错误
错误代码: HTTP Status 400 - type Status report message description The request sent by the client was sy ...