以下代码工作并生成给定结果的原因是什么?它是一种php刚刚支持的特殊语言构造吗?如果是,那是哪一个?或者只是一个简单的php-ism?

class Foo {};

$a = new Foo();
$b = new $a();

var_dump($a); // class Foo#1 (0)
var_dump($b); // class Foo#2 (0)

最佳答案

php允许您从如下变量创建对象实例:

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

因此,当您使用new $a时,php将检查它是否是一个字符串来创建类的新实例,如果它是一个对象,它将检索对象实例的类名并从中创建一个新实例。
如果尝试对非字符串或非对象变量执行相同操作:
$a = 1;
$b = new $a;

这将生成错误:
php错误:类名必须是有效的对象或字符串
php 5.3.0引入了两种创建对象实例的新方法,这是您提供的场景示例:
class Test {}

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

有关更多信息,请阅读示例5在https://www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new下创建新对象

09-10 11:39
查看更多