PHP:对象实例上的 new 运算符创建一个对象实例。为什么?

PHP: new operator on an object instance creates an object instance. Why?

以下代码工作并生成给定结果的原因是什么。它是 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 正在检查它是否是一个字符串以创建 class 的新实例,如果它是一个对象,它将检索class 对象实例的名称并从中创建一个新实例。

如果您尝试对 non-string 或 non-object 变量执行相同的操作:

$a = 1;
$b = new $a;

这会产生一个错误:

PHP Error: Class name must be a valid object or a string

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

下创建新对象