問題の原因
2 日前にグループで new と stdClass について質問した人がいます。具体的なパフォーマンスは次のとおりです:
<?php $a = new stdClass; $b = new $a; var_dump($a, $b);
このコードは正しく実行でき、$a と $b は 2 つの異なるオブジェクトです。 。新しい $a の前に属性が追加され、値が $a に割り当てられた場合でも、 $b は常に空のオブジェクトです。
それでは、なぜ空のオブジェクトが new の後に続くことができるのでしょうか? stdClass には何か特別なものがあるのでしょうか?
実際のパフォーマンス
実際、これは stdClass とはまったく関係なく、たとえば psysh で簡単なテストを実行してください。
>>> $a = new Reflection; => Reflection {#174} >>> $b = new $a; => Reflection {#177}
>>> class Test { public $foo = 1; } => null >>> $a = new Test => Test {#178 +foo: 1, } >>> $a->foo = 2; => 2 >>> $b = new $a; => Test {#180 +foo: 1, }
ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV) { ... if (OP2_TYPE == IS_CONST) { ... } else if (Z_TYPE_P(class_name) == IS_OBJECT) { Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name); } ... ... }