0

親クラスのデストラクタが2回呼び出される理由を誰かが説明できますか?子クラスは、以下を使用してのみ親のデストラクタを呼び出すことができるという印象を受けました:parent :: __ destruct()

class test {

    public $test1 = "this is a test of a pulic property";
    private $test2 = "this is a test of a private property";
    protected $test3 = "this is a test of a protected property";
    const hello = 900000;

    function __construct($h){
        //echo 'this is the constructor test '.$h;
    }

    function x($x2){
        echo ' this is fn x'.$x2;
    }
    function y(){
        print "this is fn y";
    }

    function __destruct(){
        echo '<br>now calling the destructor<br>';
    }
}

class hey extends test {

    function hey(){
        $this->x('<br>from the host with the most');
        echo ' <br>from hey class'.$this->test3;
    }
}

$obj = new test("this is an \"arg\" sent to instance of test");
$obj2 = new hey();
echo $obj2::hello;
/*
 the result:
 this is fn x
 from the host with the most 
 from hey classthis is a test of a protected property900000
 now calling the destructor

 now calling the destructor
 */
4

4 に答える 4

4
$obj = new test("this is an \"arg\" sent to instance of test");
$obj2 = new hey();

ここで2つのオブジェクトが作成されています。どちらもスクリプトの最後で破棄されます。

クラスheyはdestructメソッドを定義しないため、destructのために親クラスを呼び出します。子クラスで破棄を定義してコードを実行すると、それが親にヒットしなくなったことに気付くでしょう。

ただし、行testにタイプのオブジェクトを作成しているため、引き続き破棄が表示されます。test$obj = new test("this is an \"arg\" sent to instance of test");

于 2012-12-03T17:37:15.420 に答える
4

__destructこれは、メソッドが子でオーバーライドされている場合にのみ適用されます。例えば:

//parent
public function __destruct() {
   echo 'goodbye from parent';
}
//child
public function __destruct() {
   echo 'goodbye from child';
}

...出力します:

goodbye from parentgoodbye from child

ただし、これは次のとおりです。

//child
public function __destruct() {
   echo parent::__destruct() . "\n";
   echo 'goodbye from child';
}

出力します:

goodbye from parent
goodbye from child

オーバーライドしない場合は、親デストラクタを暗黙的に呼び出します。

于 2012-12-03T17:32:26.163 に答える
1

クラスはその親からメソッドをhey継承します。__destructしたがって、testオブジェクトが破棄されると呼び出され、heyオブジェクトが破棄されると再度呼び出されます。

この変更を検討してください。

class hey extends test{
    function hey(){
        $this->x('<br>from the host with the most');
        echo ' <br>from hey class'.$this->test3;
    }

    function __destruct(){
    }
}

その後、破棄メッセージは1回だけ出力されます。

サンプル(コード):http ://codepad.org/3QnRCFsf

サンプル(変更されたコード):http ://codepad.org/fj3M1IuO

于 2012-12-03T17:32:37.973 に答える
1

その唯一の印象…。

デストラクタのPHPDOC

コンストラクターと同様に、親デストラクタはエンジンによって暗黙的に呼び出されることはありません。親デストラクタを実行するには、デストラクタ本体でparent :: __ destruct()を明示的に呼び出す必要があります。

exit()を使用してスクリプトの実行を停止した場合でも、デストラクタが呼び出されます。デストラクタでexit()を呼び出すと、残りのシャットダウンルーチンが実行されなくなります。

あなたが何をしない場合は、それを上書きする必要があります

class test {
    function __destruct() {
        var_dump(__CLASS__);
    }
}
class hey extends test {

    function __destruct() {   // <------ over write it 
    }
}
$obj = new test();
$obj2 = new hey();
于 2012-12-03T17:38:25.767 に答える