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

啥都很少说:php

举个栗子:sql

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 ;spa

在来看第二个true code

咱们理解为 在 extendWangjh 这个类中的 self 仍是指向了子类,为何呢?对象

不服 接着作测试 看下面这两段:继承

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

在这里作测试居然 new self 仍是说调用了子类:get

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

 

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

在第一 结果 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

相关文章
相关标签/搜索