如何使用"new"操作符使用另一个对象引用而不是类名来创建新对象?看看b美元是怎么被创造出来的…$a是对一个对象的引用。
代码示例:
class test {
function aaa() {echo "aaa";}
}
$a = new test();
$b = new $a();
$b->aaa();
$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
由于PHP的变量变量函数/噩梦/上帝发送,这工作得很好。
来自它的文档(比我能做的要清晰得多):
类属性也可以使用变量属性名访问。变量属性名将在进行调用的范围内解析。例如,如果您有一个表达式,如$foo->$bar,那么将检查局部作用域的$bar,并将其值用作$foo的属性名。如果$bar是数组访问,
也可以使用花括号来清楚地分隔属性名。当访问包含数组的属性中的值时,当属性名由多个部分组成时,或者当属性名包含其他方式无效的字符(例如来自json_decode()或SimpleXML)时,它们是最有用的。
在这种情况下,似乎即使对象$a
不能通过echo $a;
语句转换为字符串,代码在创建新类时将其操作为test
-假设这是由于它已经是类test
的实例。
我不建议使用这种类型的变量变量,太混乱和不直观?
好吧,我做了更多的调查和实验。它看起来像是5.3中clone函数的简写:
<?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
因此,值不会被复制,但构造函数会被正常使用。
事实上你做不到,因为没有意义。
如果你用reference表示指向某个对象,用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);