ホームページ  >  記事  >  バックエンド開発  >  PHPのクラスのコンストラクターパラメータに関連する問題

PHPのクラスのコンストラクターパラメータに関連する問題

WBOY
WBOYオリジナル
2016-06-13 13:22:391301ブラウズ

php のクラスのコンストラクター パラメーターの問題
詳細なコードは次のとおりです。
final class Registry {
private $data = array();
public function get ($key) {
return $this->data[$key];
}
public function set($key, $value) {
$this->data[$key] ] = $value ;
}
}
抽象クラス コントローラー {
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 のまま) には影響しません。
解決

-----解決策---------
さて、__clone() コンストラクターです。オブジェクトを複製する理由は、以前の状態を変更したくないためです。

Google で見つけたオブジェクトの受け渡しに関する次のセクションを参照してください。 🎜>PHP5 は Zend Engine II を使用しており、オブジェクトは他の一般変数のように Zval に保存されるのではなく、別の構造のオブジェクト ストアに保存されます (PHP4 では、オブジェクトは一般変数と同様に Zval に保存されます)。 Zval には、オブジェクトの内容 (値) ではなく、オブジェクトのポインタのみが格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインターを保持し、この特定のオブジェクトが別の zval を介してポイントしていることをオブジェクト ストアに通知するだけです。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造体に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトは常に参照によって渡されるように見えるため、PHP のオブジェクトはデフォルトで「参照」によって渡され、PHP4 のように & を使用してオブジェクトを宣言する必要がなくなりました。

私はこれまでこの種の問題について考えたことはありませんでしたが、あなたの質問を見て初めて情報を探しました。

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