带有对象引用的PHP new运算符

时间:2014-07-23 07:27:31

标签: php

如何使用" new"运算符使用另一个对象引用而不是类名创建新对象?看看如何创建$ b ... $ a是对象的引用。

代码示例:

class test {
    function aaa() {echo "aaa";}

}


$a = new test();
$b = new $a();
$b->aaa();

3 个答案:

答案 0 :(得分:2)

$a = new Foo;
$b = new $a;

这只是一种简写符号,意思是创建同一类的新对象,$a是一个实例。它不是克隆或复制或其他任何东西。

它的简写与:

$foo = new Foo;
echo $foo::BAR;

"正确"使用类常量的语法是Foo::BAR,但$foo是指类,因此使用$foo::BAR是一种便利的简写。事实上,它不止于此,它通过允许您的对象实例被替换以及您的代码动态引用这些替换中可能被覆盖的常量来实现多态性。 new $foo是同一类东西,它允许你动态地实例化类,而不必确切地知道它是什么类。

这并不一定是伟大的想法,但它有时可能会有用。

这些机制在PHP 5.3中引入:http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new

答案 1 :(得分:1)

由于PHP的变量函数/恶梦/天赐之物,这非常有效。

http://php.net/manual/en/language.variables.variable.php

从它上面的文档(比我能做得更清晰):

  

也可以使用变量属性名访问类属性。变量属性名称将在进行调用的范围内解析。例如,如果你有一个表达式,例如$ foo-> $ bar,那么本地范围将被检查$ bar,它的值将被用作$ foo属性的名称。如果$ bar是数组访问权限,也是如此。

     

也可以使用大括号来清楚地界定属性名称。当访问包含数组的属性中的值,属性名称由多个部分组成时,或者属性名称包含其他方式无效的字符时(例如,来自json_decode()或SimpleXML),它们最有用。

在这种情况下,似乎即使对象$a无法通过echo $a;语句转换为字符串,代码也会在创建新类时将其操作为test - 假设它是由于它已经是类test的实例。

我不建议使用变量变量,这太混乱和不直观了?

好的,我做了更多的挖掘和实验。看起来它只是5.3中克隆功能的简写:

<?php 
    class test 
    {
        public $inc=0;
        public function __construct()
        {
            $this->inc++;
        }   
        function aaa() {echo $this->inc."<br>";}

    }


    $a = new test();
    $a->aaa();
    $b = new $a();
    $b->aaa();
    $a->inc=5;
    $a->aaa();
    $c = new $a();
    $c->aaa();
    $d= clone $b;
    $d->aaa();
?>

输出:

1
1
5
1
1

因此,值不会被复制,但构造函数将被正常使用。

答案 2 :(得分:-1)

事实上你不能这样做,因为没有意义。

如果您使用引用,则指向某个对象并使用new来创建新对象。

语法:

$b = new & $a();

无效,因为它没有任何意义。

在上面的代码中$a不是引用。这只是一个测试对象。并且$b也是测试的对象而不是参考,而不是$a

的副本
<?php
class test {
    public $x = 20;

    function aaa() {echo "aaa";}

}


$a = new test();
$a->x = 10;
$b = new $a();
echo $b->x."<br />";
echo $a->x."<br />";
$a->x = 30;
echo $b->x."<br />";
echo $a->x."<br />";

var_dump($a);
var_dump($b);