Zend_ValidateやZend_Filterで静的呼び出しを行った際、該当のファイルを自力でインクルードしなくても勝手に対応するクラスがインクルードされていました。
そのインクルードを行っている実体がZend_Loaderです。
まあやってることは_を/にしてインクルードしてるだけです。
例えば引数として'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
で、このZend_Loader::isReadableが引数として何故かクラス名ではなくファイル名を必要とするので、結局呼び出し側でも自力でクラス名→ファイル名の変換という同じ処理を行わないといけない果てしなく微妙な作り。
そのインクルードを行っている実体が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
トラックバック
トラックバックURL: