English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHPクラスの自動ロードメカニズムの深い理解

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クラスの自動ロードメカニズムは、編集者が皆さんに共有した全ての内容です。皆さんに参考になれば幸いですし、呐喊チュートリアルのサポートを多くいただければと思います。

基本チュートリアル
おすすめ