ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるオブジェクト参照とデストラクタの関係について

PHPにおけるオブジェクト参照とデストラクタの関係について

黄舟
黄舟オリジナル
2017-07-02 10:27:361242ブラウズ

PHPでは、コンストラクターデストラクターは両方ともマジックメソッドに属します。例えば、コンストラクターがクラス内にある場合は、クラスがインスタンス化されるときに自動的に呼び出されますが、デストラクターはクラス内にあるときに自動的に呼び出されます。このクラスの オブジェクト が破棄されたときに呼び出されます。デフォルトでは、プログラムの実行が終了したときに自動的に呼び出されます。

オブジェクトに reference を作成すると、$obj などのオブジェクトが 1 つだけインスタンス化される場合、$obj = null; というステートメントがある限り、デストラクターの呼び出しも変更されます。これは、オブジェクト $obj が破棄されることを意味します。この時点で、デストラクターが早期に呼び出されますが、このクラスの他のオブジェクトは影響を受けません。

$obj1 = &$obj;、つまり & シンボル参照割り当て操作を使用する場合、この操作は、いわゆる 2 つのオブジェクトが実際に同じメモリ ヒープ領域を使用することはありません。 . When $ obj または $obj1 のどちらかが破壊されると、もう一方も同時に消滅します。

$obj1 = $obj; 操作を使用する場合、これはオブジェクトへの新しい参照を生成するため、$obj または $obj1 が破棄されると、デストラクターは実行されません。もう一方のオブジェクトは引き続き通常どおり使用できますが、両方が破棄されるまでデストラクターは実行されません。これは、これら 2 つが 2 つのオブジェクトではないことを示していますが、この参照操作では相互参照関係が作成されません。関係。干渉しないが、オブジェクトを参照する新しいオブジェクト。一方のオブジェクトのメンバーが変更されると、他方のオブジェクトのメンバーもそれに応じて変更され、相互に関連するため、=& 演算の間に = による直接代入が行われます。そしてクローン操作の状況。

クローン操作を実行する場合、$obj1 = clone $obj になります。この操作では、$obj1 と $obj は 2 つのオブジェクトであり、一方のメンバーを変更しても、もう一方のメンバーには影響しません。 , $obj1 のすべてのメンバーの属性値は $obj とまったく同じです。これが真のレプリケーションです。コピーする場合、クラス内に clone() マジック メソッドを記述して、$obj1 の一部の属性に新しい値を与えたり、不要な値をブロックしたりすることもできます。実装メソッドの簡単な例を次に示します。

class Player{
    public $name;
    function destruct(){
        echo "Destroying ".$this->name."<br />";
    }
    //设置魔术方法,赋值时会自动调用这里的属性值,作用是初始化值,或屏蔽不想要的值
    function clone(){
        $this->name="gbcs";
    }
}
$james=new Player();
$james2=clone $james;
echo $james2->name.&#39;<br />&#39;;
$james->name="james";
$james2->name="james2";
echo $james->name.&#39;<br />&#39;;
$james=null;
echo $james2->name.&#39;<br />&#39;;

実行結果は以下の通りです:

実行結果によれば、cloneは互いに独立した2つのオブジェクトを生成し、マジックメソッドを生成していることが明確にわかります。 clone() も呼び出されます。 分析から、2 つのオブジェクトが別々に破棄されることもコンストラクターの実行シーケンスからわかります。これは代入とは異なる意味を持っています。

以上がPHPにおけるオブジェクト参照とデストラクタの関係についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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