PHPのクラス自動読み込みの仕組み
PHPの開発プロセス中、外部からクラスを導入したい場合は、通常、includeメソッドとrequireメソッドを使用して、このクラスを定義するファイルをインクルードします。小規模に開発する場合には大きな問題はありません。しかし、大規模な開発プロジェクトでは、これを行うと大量の require メソッド呼び出しまたは include メソッド呼び出しが生成され、効率が低下するだけでなく、コードの保守が困難になります。さらに、require_once は非常に高価です。
PHP5 より前では、各 PHP フレームワークがクラス の自動ロードを実装したい場合、通常、特定の合意に従って トラバース ディレクトリ を実装し、合意されたルールに準拠するすべてのファイルのクラスまたは関数を自動的にロードしていました。 もちろん、PHP5 より前のオブジェクト指向のサポートはあまり良くなく、クラスの使用は現在ほど頻繁ではありませんでした。 PHP5 以降では、PHP クラスをロードするときに、クラスが配置されているファイルが含まれていない場合、またはクラス名が間違っている場合、Zend エンジンは自動的に autoload 関数を呼び出します。この機能を使用するには、ユーザー自身がオートロード機能を実装する必要があります。 PHP5.1.2以降では、spl_autoload_register関数を使用して自動ロード処理機能をカスタマイズできるようになりました。この関数が呼び出されない場合、SPL のカスタム spl_autoload 関数がデフォルトで使用されます。
1. オートロードの例:function autoload($class_name) { echo 'autload class:', $class_name, '<br />'; } new Demo();
その後、エラーが報告されます: Fatal error: Class 'Demo' not found
を使用してクラスを自動的にロードします:
<?php function autoload($class_name) { require_once ($class_name . “class.php”); } $memo= new Demo();
SPL 標準ライブラリが PHP5 で導入され、新しいソリューションは spl_autoload_register() 関数です。
2. spl_autoload_register() 関数function autoload($class_name) { echo 'autload class:', $class_name, '<br />'; } function classLoader($class_name) { echo 'SPL load class:', $class_name, '<br />'; } spl_autoload_register('classLoader'); new Test();//结果:SPL load class:Test
语法:bool spl_autoload_register ( [callback $autoload_function] ) 接受两个参数:一个是添加到自动加载栈的函数,另外一个是加载器不能找到这个类时是否抛出异常的标志。第一个参数是可选的,并且默认指向spl_autoload()函数,这个函数会自动在路径中查找具有小写类名和.php扩展或者.ini扩展名,或者任何注册到spl_autoload_extensions()函数中的其它扩展名的文件。
<?php class CalssLoader { public static function loader($classname) { $class_file = strtolower($classname).".php"; if (file_exists($class_file)){ require_once($class_file); } } } // 方法为静态方法 spl_autoload_register('CalssLoader::loader'); $test = new Test();
一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用autoload()函数。如果要避免这种情况,需采用一种更加安全的spl_autoload_register()函数的初始化调用方法:
if(false === spl_autoload_functions()){ if(function_exists('autoload')){ spl_autoload_registe('autoload',false); } }
spl_autoload_functions()函数会返回已注册函数的一个数组,如果SPL自动加载栈还没有被初始化,它会返回布尔值false。然后,检查是否有一个名为autoload()的函数存在,如果存在,可以将它注册为自动加载栈中的第一个函数,从而保留它的功能。之后,可以继续注册自动加载函数。
还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以使用某个对象的方法。
下一步,通过调用spl_autoload_call('className')函数,可以手动调用加载器,而不用尝试去使用那个类。这个函数可以和函数class_exists('className',false)组合在一起使用以尝试去加载一个类,并且在所有的自动加载器都不能找到那个类的情况下失败。
f(spl_autoload_call('className') && class_exists('className',false)){ } else { }
SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。
以上がPHPクラスの自動ロード機構の例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。