Weitere ähnliche Inhalte
Ähnlich wie 5分で分かる名前空間とオートロード (20)
5分で分かる名前空間とオートロード
- 9. インポートとエイリアス
● インポート
namespace HolyExample;
use ZendOAuthConsumer;
//インポートしたクラス名 Consumer でアクセスできる
$consumer = new Consumer();
● エイリアス
namespace HolyExample;
use ZendOAuthConsumer as OAuthConsumer;
//定義したエイリアス OAuthConsumer でアクセスできる
$consumer = new OAuthConsumer();
※適切なクラス名を付けていれば基本的にはインポートのみで良いはず
- 15. stream_resolve_include_path
オートロードが呼ばれると、
コールバックオートローダの引
数にクラス名が完全修飾名で渡
されるので、PSR-0の仕様に
従ってファイルパスに変換し、
インクルードパスを考慮しつつ
ファイルを検索する必要があり
ます。
そこで役に立ったのが、この関
数
これ使えば、もう @include とか
書かなくてもいい
※PHP5.3.2以降
- 16. オートロード こんな時に呼ばれる
namespace HolyExample;
//クラスのインスタンスを生成
$foo = new Foo(); //HolyExampleFoo
//スタティックメソッドをコール
$foo = Foo::getClass();
//クラス定数を記述
Foo::CONSTANT;
//クラス/インタフェース定義で extends, implements
class RuntimeException
extends RuntimeException //RuntimeException
implements Exception {} //HolyExampleException
- 17. オートロード こんな時に呼ばれる
namespace HolyExample;
//スタティックメソッドのコールバックを呼ぶ
call_user_func(array('HolyExampleFoo',
'getClass'));
//class_exists(), interface_exists()で第2引数を指定しな
い、またはtrueを指定
if (class_exists('HolyExampleFoo'))
※動的にクラス名を指定する際は完全修飾名で書かないとダメ
- 18. オートロード こんな時には呼ばれない
namespace HolyExample;
//タイプヒンティング
public function setFoo(Foo $foo)//HolyExampleFoo
//instanceof演算子
if ($foo instanceof Foo)//HolyExampleFoo
//try-catch節
try {
} catch (Exception $e) {//HolyExampleException
}
- 19. オートロード こんな時には呼ばれない
namespace HolyExample;
//is_a(), is_subclass_of()
if (is_a($foo, 'HolyExampleFoo'))
//スタティックメソッドのコールバックをis_callable()
if (is_callable(array('HolyExampleFoo',
'getClass'))//普通にis_callable()のエラーにはなる
//class_exists(), interface_exists()で第2引数にfalseを指
定
if (class_exists('HolyExampleFoo', false))
※動的にクラス名を指定する際は完全修飾名で書かないとダメ
- 20. オートロードが呼ばれないと…
try {
//UnknownExceptionがスローされるかもしれない処理
} catch (UnkomanException $e) {//タイプミスしてる
mail('dev@example.com', 'Unknown error',
$e->getMessage());
}
例外がスローされた時にメールで通知するつもりが…
Fatal error: Uncaught exception
'HolyExampleUnknownException' with message...
※そもそもこういう場当たり的な例外処理は避けた方が無難ですが
- 22. まとめ
● 名前空間は普通に使うだけなら難しくない
● BOM付きUTF-8の罠には要注意
● 名前空間/クラス名とファイルパスの対応はPSR-0を参考に
● try-catchやinstanceofで例外を扱う時はオートロードが
呼ばれないのでtypoに気をつけて
拙作オートローダのコードはgistに掲載しています。
https://gist.github.com/1127033
ありがとうございました。