3

次の設定をしている場合、PHP5は__destruct()関数を呼び出していないことがわかりました。

クラステスト{
 __destruct()
 {{
  エコー'hehe';
  出口;
 }
}

header('場所:http://test.com/');
出口;

destruct関数を呼び出すことはありません

4

1 に答える 1

12

デストラクタは次のように呼ばれます。

  • あなたがインスタンス化したオブジェクトに対して
    • 投稿したスクリプトの部分では、オブジェクトをインスタンス化していません。これが、デストラクタが呼び出されない原因である可能性がありますか?
  • PHPスクリプトの最後に

ヘッダーを使用してリダイレクトしても、デストラクタの呼び出しが妨げられることはありません。


また、デストラクタはPHPスクリプトの最後に呼び出されることに注意してください。ただし、「リダイレクト」というヘッダーがすでに生成されているため、リダイレクトが妨げられることはありません。

たとえば、このコードでは:

class Test {
    public function __destruct() {
        echo 'hehe';
        file_put_contents('/tmp/test-desctructor.txt', "glop\n");
        exit;
    }
}

$a = new Test();

header('Location: http://example.com/');
exit;

(いくつかの間違いを修正し、クラスの実際のインスタンスを追加したことに注意してください)

出力に「」は表示されませんが、ファイルが作成されているheheことがわかります。/tmp/test-desctructor.txt

$ cat /tmp/test-desctructor.txt
glop

出力に「」を付けたい場合は、リダイレクトを削除する必要がありますhehe


デストラクタは、ヘッダーが生成された後に呼び出されます。デストラクタからexitを呼び出しても、そのヘッダーがすでに生成されているという事実は変わりません。

ああ、これがマニュアルからのメモです (引用-ページの下部にあります)

注:スクリプトのシャットダウン中に呼び出されたデストラクタには、HTTPヘッダーがすでに送信されています。

これが、""文字列が表示されない理由ですhehe。デストラクタは;と呼ばれます。画面に表示されないだけです;-)

そのため、私の例ではファイルを使用しました、ところで;-)

于 2009-09-21T21:24:00.507 に答える