PHPのほとんどのリソースはメモリ管理には触れません。なぜなら、言語自体がこれを行うのにはかなり良いからです。しかし、PHPでは、メモリではない外部リソース(データベースハンドル、セッション、データベーストランザクションなど)を処理することがよくあります。これらの外部リソースは、RAIIオブジェクトの何らかの形式を使用して最もきれいに管理できます。PHPはRAIIパターンをサポートしていますか?どうやって?
私は当初、PHPは、デストラクタの概念が存在しないJVMやCLRに似たガベージコレクションスキームを使用していると考えました。特定の__destruct
メソッドがありますが、それはJavaまたはC#ファイナライザに似た「ファイナライザ」だと思っていました(覚えています:Everyone thinks about garbage collection the wrong way - ファイナライザはデストラクタではありません)。このため、JVMまたはCLR上でRAIIを使用することはできません(C#のusing
ブロックでは、その方法の約95%が得られますが、これは少し異なります...)。
ただし、Google seems to indicate that PHP supports the RAII patternですが、これはPHPのドキュメントで確認できません。言語がこれをサポートしていて、RAIIタスクを達成するのに十分なクリーンアップロジックを__destruct
に入れていますか?
もう一つの注意点:複数のオブジェクトを同時にスコープを去るとき、彼らのデストラクタが呼び出される順序が正式に定義されていない、通常はFIFO順に(正確に適切なRAIIのために必要とされるものの反対)。それは私の特定のユースケースのためのデングブレイカーです。 – Brilliand
@Brilliand人工的にカッコを追加して順序付けを強制することはできますか? :) – hobbs
中括弧はそれをしません - 機能だけが新しい範囲を導入することができます。それでも可能だと思いますが、それは定型文の量が多いことになります。 – Brilliand