logo

マジックメソッドを巡る旅 その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/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。