詳細なコードは次のとおりです:
<?php final class Registry { private $data = array(); public function get($key) { return $this->data[$key]; } public function set($key, $value) { $this->data[$key] = $value; } } abstract class Controller { protected $registry; public function construct($registry) { $this->registry = $registry; } } class ControllerCommonHome extends Controller { public function test() { $this->registry->set('load','load'); } } $registry = new Registry(); $con = new ControllerCommonHome($registry); $con->test(); echo $registry->get('load'); ?>
$conオブジェクトを初期化するときに、パラメータ$registryはどのように渡されますか? 値を渡すそれともアドレス?値によって渡される場合、$con オブジェクトが関数 test() を実行するとき、元のオブジェクト $registry には影響を与えるべきではありませんが、実際にはレジストリの値に影響します。
しかし、$registry を $registry = 123 などの単純な変数に変更し、$con オブジェクト内の $registry に値を割り当てた場合、今回は元の変数 (123 のまま) には影響しません。
解決
OK、clone() コンストラクター。オブジェクトを複製する理由は、オブジェクトは一般変数ではないためです。他の
ストアとは異なり、独立した構造
オブジェクト ストアを参照してください。 Zval に格納される変数 (PHP4 では、オブジェクトは一般変数と同様に Zval に格納されます)。 Zval には、オブジェクトの内容 (値) ではなく、オブジェクトのポインタのみが格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインタを保持し、別の zval がこの特定のオブジェクトが現在指していることをオブジェクト ストアに通知させます。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造体に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトは常に参照 (参照) によって渡されるように見えるため、PHP のオブジェクトはデフォルトで「参照」によって渡され、PHP4 のように & を使用して宣言する必要がなくなりました。
私はこれまでこの種の問題について考えたことはなく、あなたの質問を見て情報を探しただけでした。
以上がPHP のクラス コンストラクター パラメーターの問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。