ホームページ >バックエンド開発 >PHPチュートリアル >PHP手册中的这个例子怎么理解?

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

WBOY
WBOYオリジナル
2016-06-06 20:41:44813ブラウズ

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;

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。