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

带有对象引用的PHP新运算符,php,Php,如何使用“new”操作符使用另一个对象引用而不是类名创建新对象?看看$b是如何创建的…$a是对对象的引用 代码示例: class test { function aaa() {echo "aaa";} } $a = new test(); $b = new $a(); $b->aaa(); 由于PHP的可变函数/噩梦/godsends,这一点非常好用 从上面的文档(比我能做的要清楚得多): 还可以使用变量属性名访问类属性。变量属性名称将在进行调用的范围内解析。例如,如果您

如何使用“new”操作符使用另一个对象引用而不是类名创建新对象?看看$b是如何创建的…$a是对对象的引用

代码示例:

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

}


$a = new test();
$b = new $a();
$b->aaa();
由于PHP的可变函数/噩梦/godsends,这一点非常好用

从上面的文档(比我能做的要清楚得多):

还可以使用变量属性名访问类属性。变量属性名称将在进行调用的范围内解析。例如,如果您有一个表达式,例如$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();
?>

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

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

如果使用“参照”,则指向某个对象,并使用“新建”创建新对象

所以语法:

$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);

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

这是一种与以下内容相同的速记:

$foo = new Foo;
echo $foo::BAR;
使用类常量的“正确”语法应该是
Foo::BAR
,但
$Foo
指的是类,因此使用
$Foo::BAR
是一种方便的速记。事实上,更重要的是,它允许替换对象实例,并允许代码动态引用这些替换中可能被重写的常量,从而支持多态性
new$foo
是同一类型的东西,它允许您动态实例化类,而无需确切知道该类是什么

这不一定是个好主意,但有时可能有用


这些机制是在PHP 5.3中引入的:

检查PHP中的对象克隆,您所做的是不正确的。您可以使用PHP对象。这只是在PHP 5.3中引入的
$a
类中创建新对象的另一种方法。这是一个如何回答的问题?@Pinoniq该代码实际上是有效的。我不认为应该,但确实如此。我敢打赌,如果PHP代码中做了足够的挖掘,如果变量不能转换成字符串,在使用变量变量时,它会使用对象的类来实例化另一个变量。嗯,你使用的是什么版本的PHP?什么发动机?我的脚本失败($b与$a不属于同一类)@Pinoniq PHP版本5.3.10-1ubuntu3.8。构建也没有什么奇怪的地方——但是OP给出的脚本输出只是
aaa
没有通知,没有警告,没有错误。哦,还有Zend脚本语言引擎:Zend引擎v2.3。0@cubob做了更多的实验。看起来这只是一个新的速记,他们补充道。很遗憾看到糟糕的编程是如何被鼓励的:(不过,这对求职面试来说可能是有用的。除了那些令人兴奋的问题,-M'eh…不会确切地称之为“糟糕的编程”。似乎有点像“为什么不呢?”情况对我来说。我不确定这种情况是否会非常有用,但它也不是毫无意义。是的,但它会让人困惑。如果你知道它的作用,就不会
$a = new Foo;
$b = new $a;
$foo = new Foo;
echo $foo::BAR;