Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:对象实例上的新操作符创建对象实例。为什么?_Php_Oop_New Operator - Fatal编程技术网

PHP:对象实例上的新操作符创建对象实例。为什么?

PHP:对象实例上的新操作符创建对象实例。为什么?,php,oop,new-operator,Php,Oop,New Operator,以下代码工作并生成给定结果的原因是什么。它是一种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将检查它是否

以下代码工作并生成给定结果的原因是什么。它是一种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在

下创建新对象手册中提到,这是因为PHP 5.3提供的查看:示例#5创建新对象(在上面的链接中)问题不是关于示例,在哪里可以看到它们,问题是“为什么这样做”。10分钟内投5票?哇!这个问题似乎比我想象的要好得多……我认为某些特定语言功能的“为什么”已经脱离主题了,所以……你有没有链接到改变这一点的RFC?为什么它被添加到PHP中?为什么它有用?
$b=新的get\u类($a)抛出一个致命错误。我肯定有一些语法错误。如果我将返回值存储在一个变量中,它会正常运行。@u\u mulder您确定您读到的答案不止一行吗?