Blogger Information
Blog 38
fans 0
comment 3
visits 43854
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
new static的细说
意外的博客
Original
3485 people have browsed it

1.new static()是在PHP5.3版本中引入的新特性。

2.无论是new static()还是new self(),都是new了一个新的对象。

3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?

为了探究上面的问题,我们先上一段简单的代码:

复制代码

class Father {

    public function getNewself() {

        return new self();

    }

    public function getNewstatic() {

        return new static();

    }

}

$f = new Father();


print get_class($f->getNewself());

print get_class($f->getNewstatic());

复制代码

注意,上面的代码get_class()方法是用于获取实例所属的类名。

这里的结果是:无论调用getNewself()还是调用getNewstatic()返回的都是Father这个类的实例。

打印的结果为:Father Father

到这里,貌似new self()和new static()是没有区别的。我们接着往下走:

复制代码

class Sun1 extends Father {

}

class Sun2 extends Father {

}

$sun1 = new Sun1();

$sun2 = new Sun2();


print get_class($sun1->getNewself()); //Father

print get_class($sun1->getNewstatic()); //Sun1

print get_class($sun2->getNewself()); //Father

print get_class($sun2->getNewstatic()); //Sun2


复制代码

看上面的代码,现在这个Father类有两个子类,由于Father类的getNewself()和getNewstatic()是public的,所以子类继承了这两个方法。

打印的结果是:FatherSun1FatherSun2

我们发现,无论是Sun1还是Sun2,调用getNewself()返回的对象都是类Father的实例,而getNewstatic()则返回的是调用者的实例。

即$sun1返回的是Sun1这个类的实例,$sun2返回的是Sun2这个类的实例。

 

new self()和new static()的区别了。

首先,他们的区别只有在继承中才能体现出来,如果没有任何继承,那么这两者是没有区别的。

然后,new self()返回的实例是万年不变的,无论谁去调用,都返回同一个类的实例,

**而new static()则是由调用者决定的。

上面的$sun1->getNewstatic()的调用者是$sun1对吧!$sun1是类Sun1的实例.

所以返回的是Sun1这个类的实例,$sun2同样的道理就不赘述了。

例子:

class test{

    protected static $instance = null;

    public static function getInstance(){

        if (is_null(static::$instance)) {

            static::$instance = new static;

        }

    return static::$instance;

    }

}

**谁调用,new static()指向的是谁,那么,这里new static()指向的就是$instance ;因为上一行判断代码调用了$instance ;




Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post