English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
PHPの自動ロード:
PHPで5以前は、あるクラスやクラスのメソッドを使用するには、includeまたはrequireが必要で、その後のみ使用できます。クラスごとにincludeを書く必要があり、面倒でした。
PHPの作者はシンプルに考えたかったようで、クラスをインクルードする際に、現在includeされていない場合でも、システムが自動的にそのクラスを見つけ、自動的にインクルードするようにしました。
そして:__autoload()関数が登場しました。
通常、アプリケーションのエントリーレベルのクラス内に配置されます、例えばdiscuzではclass_core.phpに配置されます。
まず簡単な例を説明します:
第一种情况:ファイルA.phpの中身は以下の通りです
<?php class A{ public function __construct(){ echo 'fff'; } } ?>
ファイルC.phpの中身は以下の通りです:
<?php function __autoload($class) { $file = $class . '.php'; if (is_file($file)) { require_once($file); } } $a = new A(); //こちらは自動的に__autoloadを呼び出し、A.phpファイルをインクルードします ?>
第2種の状況:時には、カスタム自動ロードを希望し、よりクールな名前loaderを使用したい場合があります。その場合、C.phpを以下のように変更します:
<?php function loader($class) { $file = $class . '.php'; if (is_file($file)) { require_once($file); } } spl_autoload_register('loader'); //自動ロードメソッドを登録し、既存の__autoloadをオーバーライドします。 $a = new A(); ?>
第3種の状況:私たちが高く上品にしたい場合は、クラスを使用して自動ロードを管理します。
<?php class Loader { public static function loadClass($class) { $file = $class . '.php'; if (is_file($file)) { require_once($file); } } } spl_autoload_register(array('Loader', 'loadClass')); $a = new A(); ?>
これは最も良い形式です。
通常、spl_autoload_register()を使用します。*)をエントリースクリプトに、すなわち最初に参照してきます。例えば以下のdiscuzのやり方。
if(function_exist('spl_autoload_register')){ spl_autoload_register(array('core','autoload')); //それがphpの場合5以上、登録関数が存在する場合、自分が書いたcoreクラスのautoloadを自動ロード関数として登録します。 }else{ function __autoload($class){ //それがそうでない場合、phpの原生関数__autoload関数を書き換え、自分のcore中の関数を呼び出します。 return core::autoload($class); } }
これはエントリーファイルの最初に置くと、非常に良いです。
以上の深い理解PHPクラスの自動ロードメカニズムは、編集者が皆さんに共有した全ての内容です。皆さんに参考になれば幸いですし、呐喊チュートリアルのサポートを多くいただければと思います。