忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/12/14 19:20 |
ZF1.11 Zend_Loader
Zend_ValidateZend_Filterで静的呼び出しを行った際、該当のファイルを自力でインクルードしなくても勝手に対応するクラスがインクルードされていました。

そのインクルードを行っている実体がZend_Loaderです。
まあやってることは_を/にしてインクルードしてるだけです。
<?php
	//Zend_Loader
	require_once('Zend/Loader.php');
	
	//任意のクラスをロード
	Zend_Loader::loadClass('Zend_Cloud_QueueService_Adapter_ZendQueue');
	Zend_Loader::loadClass('Spreadsheet_Excel_Writer_Worksheet');
	
	//インクルードパスを指定してロード
	Zend_Loader::loadClass('Hoge_Fuga_FooBar', '../');
	$hogeFugaFooBar = new Hoge_Fuga_FooBar();
ファイル名およびクラス名はPearの命名規約に沿っている必要があります。
例えば引数として'Zend_Cloud_QueueService_Adapter_ZendQueue'を与えると、'Zend/Cloud/QueueService/Adapter/ZendQueue.php'をインクルードしてクラス名'Zend_Cloud_QueueService_Adapter_ZendQueue'が存在するかまでをチェックします。
従って、ZendライブラリだけではなくPearライブラリもZend_Loaderでインクルード可能ですが、SymfonyのライブラリはPearの命名規則に沿っていないので読み出し不可能です。
また第二引数にパスを与えると、指定された場所からの相対ディレクトリのみをチェックします。

このファイル名の変換は先日やったZend_Filter_Word_UnderscoreToSeparator('/')そのままなのでこれを使っているのかと思いきや、全く使わずZend_Loader内で普通に自力で実装していました。
なんだそれ。


まあともかく、このようにZend_Loader::loadClass()にはクラス名をファイル名に変換する仕組みが備わっているのですが、実際このZend_Loaderを使用しているクラスを見てみると、

Zend_Validate
	$className  = ucfirst($classBaseName);
	$class = $namespace . '_' . $className;
	$file  = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
	if (Zend_Loader::isReadable($file)) {
		Zend_Loader::loadClass($class);
	}
Zend_Filter
	$className = $namespace . '_' . ucfirst($classBaseName);
	$file = str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
	if (Zend_Loader::isReadable($file)) {
		Zend_Loader::loadClass($className);
	}
まずZend_Loader::isReadableでファイルが存在するか確認してからZend_Loader::loadClassでクラスを呼び出しています。
で、このZend_Loader::isReadableが引数として何故かクラス名ではなくファイル名を必要とするので、結局呼び出し側でも自力でクラス名→ファイル名の変換という同じ処理を行わないといけない果てしなく微妙な作り。
PR


2011/09/09 23:09 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<今週の実績 2011/09/11 | HOME | ZF1.11 Zend_Filterで命名規則変換>>
忍者ブログ[PR]