ホームページ  >  記事  >  バックエンド開発  >  PHP が最初にインスタンス化されたオブジェクトのデストラクターを実行するのはなぜですか?

PHP が最初にインスタンス化されたオブジェクトのデストラクターを実行するのはなぜですか?

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

質問 1: 質問は前述したとおりです。私は自分でテストしました

class Obj{        
public $i;        
        public function construct($t){            
        $this->i = $t;            
        echo "执行构造函数$this->i";            
        echo "<br>";
        }        
        public function destruct(){            
        echo "执行析构函数$this->i";            
        echo "<br>";
        }
    }
    $obj1 = new Obj(1);
    $obj2 = new Obj(2);

执行构造函数1执行构造函数2执行析构函数2执行析构函数1

質問 2: サブクラスで親クラスのコンストラクター メソッドを呼び出すとき、それは親クラスを初期化するだけですか、それともオブジェクトを生成しますか?親クラスの?

======================================更新========= =============================

さらに詳しい説明を見つけてください:

データを保存するためにヒープとスタックのどちらを使用するかは PHP によって決定されます。PHP 開発者は気にする必要はありません。
転送:
PHP5 の Zend Engine の実装では、すべての値はヒープ上の領域に割り当てられ、参照カウントとガベージ コレクションを通じて管理されます。
PHP5 の zval 構造体への Zend エンジン ポインターは、主に値を操作するために使用され、多くの場所で zval の二次ポインターを介して操作されることもあります
PHP7 の Zend エンジン実装では、値は zval 構造体自体を介して操作されます。 (ポインターではありません)
新しい zval 構造は、VM のスタック、HashTable のバケット、および属性スロットに直接保存され、ヒープ上のメモリの割り当てと解放の操作が大幅に軽減されます。単純な値の参照カウントとガベージ コレクションを回避します。
==================================== UPDATE1========= ============================

具体的な説明を見つける

$p1 =このコードの場合、 $p1 はスタック メモリ内のオブジェクト名です。 詳細については、次の図を参照してください。最初にインスタンス化されたオブジェクトは後で解放されます。

new Person(); は実際にはオブジェクトへの参照を返し、その参照はスタックに格納されている変数であり、そのエンティティを指すポインタです。ヒープに割り当てられたオブジェクト

これは、PHP の基礎となるストレージ変数には、変数のライフサイクルを維持するためのハッシュ シンボル テーブルがあることも説明しています。シンボル テーブルには、key=>value のペアが含まれています。ここで、key は変数名であり、key は変数を指します。 zval構造体、つまりvalueの先頭アドレスですPHP が最初にインスタンス化されたオブジェクトのデストラクターを実行するのはなぜですか?

コンストラクタとデストラクタの実行は実際にはスタック構造を使用します。Obj(2)は後から作成されるため、スタックの先頭に位置し、 の順で破棄されます。 stack first in, last out の場合、Obj(2) が最初に破棄されます。

投稿者の質問を読んだ後、

执行构造函数1
执行构造函数1
执行析构函数2
执行析构函数2

PHP 5 が C++ などの他の

オブジェクト指向 言語と同様のデストラクターの概念を導入した理由も知りたいと思いました。デストラクタは、オブジェクトへの参照がすべて削除されたとき、またはオブジェクトが明示的に破棄されたときに実行されます

つまり、プロセスは次のようになります

Obj(1) 启动,申请自己的内存空间与上下文环境
Obj(2) 启动,申请自己的内存空间与上下文环境
Obj(2) 销毁,垃圾回收
Obj(1) 销毁,垃圾回收

それは、先入れ後出しのようなObj(1)です。インスタンス化後なので、最初に破棄してください

----------------------------
Obj(1) Obj(2) Obj(2) Obj(1)
----------------------------

質問 2: サブクラスで親クラスのコンストラクター メソッドを呼び出すと、親クラスが初期化されるだけで、親クラスのオブジェクトが生成されますか? 同じマニュアル。継承はよく知られたプログラミング機能であり、PHP のオブジェクト モデルも継承を使用します。継承は、クラス、オブジェクト、およびオブジェクト間の関係に影響を与えます。

たとえば、クラスを拡張する場合、サブクラスは親クラスのすべての public メソッドと protected メソッドを継承します。サブクラスが親クラスのメソッドをオーバーライドしない限り、継承されたメソッドは元の機能を保持します。

サブクラスは親クラスのメソッドを呼び出すことができ、継承関係にはインスタンス化はありません。

質問 1: オブジェクト参照を保持する変数はスタックに格納されます。変数 obj2 は最初に Obj1 と比較され、破棄されます

質問 2: サブクラス オブジェクトは 1 つだけ生成されます

最初の質問: Obj1 と obj2 は明らかにスタック メモリに格納されます。スタック メモリの特性によれば、obj2 は当然スタック メモリに格納されます。スタックメモリの特性に従って、最初に破棄されます。つまり、obj2 の destruct が最初に実行され、次に obj1 が破棄されます。つまり、obj1 の _desctruct が実行されます。これは注文の問題の説明にもなります。

2 番目の質問: サブクラスをインスタンス化すると、親クラスのオブジェクトは生成されません。親クラスの public メソッドと protected メソッドは、インスタンス化されたオブジェクト上に存在します。したがって、親クラスのメソッドを呼び出すことができます。

以上がPHP が最初にインスタンス化されたオブジェクトのデストラクターを実行するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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