ホームページ  >  記事  >  バックエンド開発  >  PHP のクラス コンストラクター パラメーターの問題の解決策

PHP のクラス コンストラクター パラメーターの問題の解決策

黄舟
黄舟オリジナル
2017-07-02 09:55:092030ブラウズ

詳細なコードは次のとおりです:

<?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(&#39;load&#39;,&#39;load&#39;);
    }
}
$registry = new Registry();
$con = new ControllerCommonHome($registry);
$con->test();
echo $registry->get(&#39;load&#39;);
?>

$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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。