文档章节

PHP中new static 的用法和new self 之间的区别

王景华
 王景华
发布于 2016/03/25 11:16
字数 719
阅读 23
收藏 0

啥都不多说:

举个栗子:

class wangjh{
    /**
     * @return wangjh 实例化self
     */
    public function selfObj(){
        return new self();
    }

    /**
     * @return static 实例化static
     */
    public function staticObj(){
        return new static();
    }

    /**
     * @return string 获取被调用的类的名称
     */
    public function sayClass(){
        return get_called_class().'<br>';
    }
}

class extendWangjh extends wangjh{

}

class root extends extendWangjh{

}

$a = new wangjh();
$aObj = $a->selfObj();

$b = new wangjh();
$bObj = $b->staticObj();

$c = new extendWangjh();
$cObj = $c->selfObj();

$d = new extendWangjh();
$dObj = $d->staticObj();

var_dump($aObj == $bObj);    // true
var_dump($aObj == $cObj);    // true
var_dump($cObj == $dObj);    // false
var_dump($aObj == $dObj);    // false
//exit;

$com = new extendWangjh();
$x = $com->selfObj();
echo $x->sayClass();
// wangjh
$con = new extendWangjh();
$y = $con->staticObj();
echo $y->sayClass();
// extendWangjh
$mon = new root();
$z = $mon->selfObj();
echo $z->sayClass();
// wangjh
$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

先来看第一个true 

我们大致可以理解为 new self = new static ;

在来看第二个true 

我们理解为 在 extendWangjh 这个类中的 self 还是指向了子类,为什么呢?

不服 接着做测试 看下面这两段:

$mon = new root();
$z = $mon->selfObj();
echo $z->sayClass();
// wangjh
$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

在这里做测试竟然 new self 还是说调用了子类:

我们这里进行如下的超前总结: self 关键字永远都是指向 self所在的类中,也就是说,如果你在 A 类中使用了 self 关键字 那么在子类中,没有对其进行相关的操作(包括重新赋值,重新声明等),这个类永远指向的是 A 类!

 

下面 再看看 new static 是个什么东西

在第一 结果 true 中我们可以基本看出来当时 new static = new self 的

但是:

var_dump($cObj == $dObj);    // false

看这里 此时同一个对象的 new static != new self  他们竟然不相等了!

刚才已经理解过了 self 永远都是代码wangjh类的(因为 extendWangjh 和root 中都没有做任何的操作),莫非static 已经不再指向 wangjh 类了吗?接着看

var_dump($cObj instanceof extendWangjh); // false
var_dump($dObj instanceof extendWangjh); // true

这里说明在 extendWangjh 中的 new self 并不是wangjh类的实例化对象 但是 new static 却是! 这里更加验证了我们上面说的 new self 是代码了子类! 这里static 代表的是 extendWangjh ,这样的话,是不是说static 代表的是子类呢!

 

看这一段

$mon = new root();
$c = $mon->staticObj();
echo $c->sayClass();
// root

没错,好像可以基本确认了 static 是子类吧!

总结如下:

我们在实例化一个类的时候,self 是不会随着继承链传递的! static 则是可以随着继承链传递下去的!

 

          更多源码,请访问 http://www.erdangjiade.com/source

          网页特效下载:www.erdangjiade.com/js

         更多PHP/Mysql功能:www.erdangjiade.com/php

          更多原创模板,尽在 http://www.erdangjiade.com/templates

© 著作权归作者所有

王景华
粉丝 2
博文 7
码字总数 4297
作品 0
松江
高级程序员
私信 提问
PHP中this,self,parent的区别

{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划...

一切_放空
2013/08/27
192
0
PHP中this,self,parent的区别

{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划...

随智阔
2012/11/21
70
0
PHP中: this, self,parent 的区别

PHP中: this, self,parent 的区别 这里我主要谈的是,, 三个关键字之间的区别。从字面上来理解,分别是指这、自己、父亲。先初步解释一下,是指向当前对象的指针(可以看成C里面的指针),是指...

DrChenXX
2018/09/06
10
0
复习PHP-语言参考-类与对象

1.简介 没啥说的。 2.基本概念 类有自己的属性和方法,内部使用可用伪变量$this(是该类的一个引用)访问属性或方法 类通过new被实例化(如果该类属于某个命名空间,则需要写全) 可以通过c...

qzd1989
2014/04/30
0
0
PHP中new static()与new self()的区别异同分析

self - 就是这个类,是代码段里面的这个类。 static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个...

lilugirl
2016/04/07
18
0

没有更多内容

加载失败,请刷新页面

加载更多

从AnnotationTransactionAspect开始rushSpring事务

0. Spring 事务 with LTW 0.1. Spring 事务 With LTW的原因: Pure Proxy-base mode有缺陷,其失效原因分析及使用方法及运行机制(LoadTimeWeaverBeanDefinitionParser和 AspectJWeavingEnable......

Aruforce
11分钟前
2
0
mac 安装protobuf 2.5.0

下载安装包 目前protobuf的最新版本是3.9.1,但是hadoop等好多框架依然依赖的是2.5.0,因此,最好不要安装最新的。 https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0 编译安...

hexiaoming123
16分钟前
3
0
Qt编写自定义控件52-颜色下拉框

一、前言 这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标签设置,这个...

飞扬青云
23分钟前
2
0
Shell脚本应用 – for、while循环语句

通过Shell脚本应用(二)学习到了if条件条件语句的使用方法等。Shell作为一种脚本编程语言,同样了包含了循环,分支等其他程序控制结构,从而能够轻松完成更加复杂、强大的功能。我们今天就来...

Linux就该这么学
29分钟前
3
0
Sqoop之导入到Hive时特殊字符导致数据变乱

问题是这样的: Sqoop从关系型数据库导入数据到Hive时,发现数据量增多了,查找之后发现是由于源数据中含义\r\t\n特殊字符的数据,这样Hive遇到之后就将其视为换行,所以导入到Hive后数据条数...

克虏伯
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部