Heim >Backend-Entwicklung >PHP-Tutorial >PHP手册中的这个例子怎么理解?

PHP手册中的这个例子怎么理解?

WBOY
WBOYOriginal
2016-06-06 20:41:44810Durchsuche

http://php.net/manual/zh/language.oop5.basic.php
PHP 5.3.0 引进了两个新方法来创建一个对象的实例:
Example #5 创建新对象

<code><?php class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
</code>

第六行的 return new static;是什么意思?
第十四行的 $obj2 = new $obj1; new后面不是应该跟类名吗?这里怎么写的是实例?

回复内容:

http://php.net/manual/zh/language.oop5.basic.php
PHP 5.3.0 引进了两个新方法来创建一个对象的实例:
Example #5 创建新对象

<code><?php class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
</code>

第六行的 return new static;是什么意思?
第十四行的 $obj2 = new $obj1; new后面不是应该跟类名吗?这里怎么写的是实例?

http://www.5dphp.com/art_117.html

return new static就是新建一个当前类对象并返回的意思,具体请参考:http://stackoverflow.com/questions/16977369/php-new-staticvariable

后接对象也是PHP 5.3新加的功能,相当于再new Test()了吧,可以看这个测试:http://3v4l.org/XMKAI

声明我是一个普通的开发者,我更多关注如何使用代码而不是问为什么。
1 static 是新增的关键字,可以理解为(或者说文档内容翻译为)用于迟绑定。例如

<code>class A {
    public static $TEST = 1;
    public function get() {
        return self::$TEST;
    }
}
class B {
    public static $TEST = 2;
}</code>

B对象实例执行get方法会得到A对象声明中定义的TEST值,而不是B本身的,但是把return self::$TEST修改成return static::$TEST则会得到预期的结果。最明显的好处是单件对象的继承变得容易了。

2 至于new $obj,应该算是个魔术写法?以前可以使用$className = 'stdClass'; $obj = new $className的方式构造,这应该是个变种吧,只是一种简化,没什么特别的。因为它很明显等效于 $className = get_class($instance); $obj = new $className;

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn