您的位置:首页 > 编程语言 > PHP开发

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

2016-03-25 00:00 357 查看
摘要: 最近在看yii框架的源码的时候发现底层有用到 new static(); 一下蒙逼了,只见过在单例中有“new self();”的写法还从来没有看到过new static()这样的写法!这个写法到底是干什么用的呢?

啥都不多说:

举个栗子:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  new static self