参考链接:【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()的更多相关文章

  1. static,你还敢用吗?(二)

    为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  4. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  5. static,你还敢用吗?

    我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...

  6. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  7. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

  8. iOS: 在UIViewController 中添加Static UITableView

    如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...

  9. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  10. 今天思考一个问题,PHP const和static的区别

    static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...

随机推荐

  1. 目标检测算法—YOLO-V1

    为什么会叫YOLO呢? YOLO:you only look once.只需要看一眼,就可以检测识别出目标,主要是突出这个算法 快 的特点.(原文:Yolo系列之前的文章:主要是rcnn系列的,他们的 ...

  2. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

    上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...

  3. ASP.NET 下使用特定身份完成windows服务的功能操作

    今天部署项目的发现一个问题: 在本地Win7系统下利用Web页面完成Windows服务的功能操作(启动.停止.安装.卸载)都是正常的,而部署到Server2008系统下,再使用Web页面完成windo ...

  4. python的字符串内建函数(方法)

    原本总结一下,后来发现这个里面讲的很全,可以点进去参考:http://www.runoob.com/python/python-strings.html

  5. python中range、xrange和randrange的区别

    range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表. xrange 函数说明:和range 的用法完 ...

  6. wap尝试调取app(网易新闻为例)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 数据库-SQLite简介

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库(轻型数据库). 由于资源占用少.性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android.iPhone都有内置的S ...

  8. PHP 运行相关概念

    web server.cgi.cgi程序.fast-cgi.php-fpm.php-cgi

  9. 术语CDATA,其实可以理解为一种特殊的转移字符

    参考:http://www.w3school.com.cn/xml/xml_cdata.asp 常见于XML文档,所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(Charact ...

  10. Linux的MySQL不能远程访问

    1.首先,你要确认用户是否只允许localhost访问: 在linux下登录mysql mysql -uroot -p密码;     use mysql;     select `host`,`use ...