マジックメソッドを巡る旅 その3
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「マジックメソッドを巡る旅 その3」を公開しました。
前回のデストラクタの続きでございます。
前回見ていただいたとおり、デストラクタは「そのインスタンスが消滅するタイミング」で走ります。
コンストラクタが「インスタンスが生成されるタイミング」なので、大変に対照的で分かりやすいです。
なので、コンストラクタの話と合わせるような流れで、少し解説をしていきましょう。
まず「書き方」ですが、すでに前回書いてしまっておりますが、__dectructメソッドを用います。
改めて、サンプルコードを書いてみましょう(前回と一緒ですが)。
class hoge {
public function __destruct() {
echo “call hoge’s destruct\n”;
}
}
//
$obj = new hoge();
__constructは「クラス名と同一のメソッド名」という古い書き方がありました。
__destructは…じつは、古い書き方がありません。なので、書き方の新旧で困る、というケースは、ないんですね。
また、デストラクタは実は、クラスが書ける言語のなかでも、存在するケース、存在しないケースがあります。
C++にはデストラクタがあり、クラス名の前にチルダ(~)を付けたメソッド名が、デストラクタになります。
Pythonは__del__メソッドがデストラクタになります。
Rubyはdefine_finalizerというものがあり、デストラクタ相当の動きをするようです。
Javaには、デストラクタがありません。
…色々ありますねぇ。
デストラクタを語る文脈では、よくRAII(Resource Acquisition Is Initialization)という概念が出てきます。
この辺は、使い方を後述しますので、そのタイミングでもう少し掘りこんでみましょう。
まずは、コンストラクタと対比するように、書き方や機能、ワンポイントを掘り下げていきます。
継承時の書き方ですが、コンストラクタとは逆で「子クラスの(より局所的な)処理をしてから、
親クラスの(より広域的、基本的な)処理をする」事が多いので、parent::は、最後に呼び出すとよいでしょう。
この続きは以下をご覧ください
http://resocia.jp/column/1761/
ソーシャルもやってます!