2

次の問題があります。クラスを使用していて、__destructor メソッドで「イベントの保存 (およびログ記録)」​​を行いたいのですが、データベース クラスがまだアクティブであること、さらには memcache クラスがまだアクティブであることを確認する必要があります。

デストラクタ メソッドの呼び出しが遅すぎることに気付きました。(データベース クラスはアクティブではなくなり、memcache クラスはアクティブではなくなりました)

私が見つけた回避策は...

$forum = new Forum_class();
$forum->output();
unset($forum) <-- unset it

これは良い習慣ですか?または、デストラクタ メソッドの使用をスキップして、アクティブな他のクラスに依存することを行う必要があります... (利用可能なデータベース クラス、利用可能な memcache クラス...)

おそらく、データベースと memcache クラスをできるだけ早く設定解除するべきではありませんが、他のクラスについては、できるだけ早く設定解除する必要があります。(ページ上で不要になった場合) または、__destructor 関数を使用する場合のみですか?

それとも私は恐ろしい間違ったことをしていますか?クラスの設定を解除することを常に確認する必要があるのは奇妙に思えます。一度忘れると、__destructor メソッドでエラーが発生する可能性があります...

編集: このバグhttps://bugs.php.net/bug.php?id=39381に出くわしたと思います。私のデータベースクラスと memcache クラスはグローバルを使用しています...

4

2 に答える 2

1

あなたはそれを正しくやっています。だが...

デストラクタは、オブジェクトへの最後のリンクが破棄された後に呼び出される場合があります。unset($ object)でも、unset()の直後にデストラクタが呼び出されることを保証するものではありません。

$forum = new Forum_class();
$forum->output();
$forumCopy = $forum;
unset($forum); // php doesnt even consider calling the destructor
unset($forumCopy); // now the destructor is going to be called... in some time
于 2012-07-14T18:29:47.733 に答える
1

または、デストラクタ メソッドの使用をスキップして、アクティブな他のクラスに依存することを行う必要があります...

基本的に、ハイブリッド アプローチを試すことはできますが、

class Foo
{
  protected $resource;

  public function close()
  {
    if ($this->resource)
    {
      $this->resource->foo();
      $this->resource = null;
    }  
  }

  public function __destruct()
  {
    $this->close();
  }
}

このようにして、リソースを明示的に「閉じる」ことができますが、念のためにデストラクタを介して遅延して行うこともできます。

クリーンアップ (close()メソッド) が重要な場合は、クリーンアップ__destructされていない場合はファイルにログを記録するようにメソッドを変更します (たとえば、通知をトリガーします)。そうすれば、これらの問題を簡単に見つけて修正できます。

于 2012-07-14T20:42:58.830 に答える