PHP __autoload()
(ドキュメント)は私にとって非常に興味深いものです。仕組みは次のとおりです。
new Toast_Mitten()
(脚注1)のようなクラスを使おうとします- クラスがメモリにロードされていません。PHPはその拳を引き戻して、エラーであなたを悩ませます。
- 一時停止します。「待って」とそれは言います。「
__autoload()
関数が定義されています。」それを実行します。 - その関数では、文字列
Toast_Mitten
を何らかの方法でマップclasses/toast_mitten.php
し、そのファイルを要求するように指示しました。します。 - これでクラスはメモリ内にあり、プログラムは実行を続けます。
メモリの利点:必要なクラスのみをロードします。簡潔さの利点:どこにでも非常に多くのファイルを含めるのをやめ、オートローダーを含めるだけで済みます。
物事は特に興味深いものになります
1)__autoload()
クラス名からファイルパスと名前を自動的に決定する方法があります。たとえば、すべてのクラスがにclasses/
あり、Toast_Mitten
になりますclasses/toast_mitten.php
。Animal_Mammal_Weasel
または、のようなクラスに名前を付けることもできますclasses/animal/mammal/animal_mammal_weasel.php
。
2)ファクトリメソッドを使用してクラスのインスタンスを取得します。
$Mitten = Mitten::factory('toast');
Mitten :: factoryメソッドは、「見てみましょう。サブクラスという名前がありToast_Mitten()
ますか?そうでない場合は、それを返します。そうでない場合は、自分のジェネリックインスタンス(標準のミトン)を返します。ああ、見て!トースト用の特別なクラスがあると__autoload()
教えてくれます。OK、これがインスタンスです!」
したがって、コード全体で一般的なミトンの使用を開始できます。トーストに特別な動作が必要になる日が来たら、そのクラスとバムを作成するだけです。-あなたのコードはそれを使用しています。
私の質問は2つあります:
- (事実)他の言語にも同様の構成がありますか?Rubyには自動ロードがあるようですが、特定のスクリプトで、Rubyを使用する予定のクラスを指定する必要があるようです。
- (意見)これは魔法すぎますか?あなたの好きな言語がこれをしないなら、あなたは「ちょっと気の利いた、私たちはそれを持っているべきです」または「私は言語Xがそれほどずさんではないことを嬉しく思います」と思いますか?
1 英語を母国語としない人に謝罪します。これは小さな冗談です。私の知る限り、「トーストミトン」のようなものはありません。もしあれば、それは熱いトーストを拾うためのミトンでしょう。おそらくあなたはあなたの国でトーストミトンを持っていますか?