ホームページ  >  記事  >  バックエンド開発  >  PHPの自動読み込みメカニズムの詳細な研究

PHPの自動読み込みメカニズムの詳細な研究

伊谢尔伦
伊谢尔伦オリジナル
2017-07-01 09:59:411996ブラウズ

この記事は、php自動読み込みメカニズムの詳細な分析と紹介です

1. php
で自動読み込みを実装する方法1. require_onceinclude_onceを手動でロードします。 2. 自動ロードには autoload を使用します。
3. 自動ロードには spl の autoload を使用します。
手動ロードの実装:

ロードするファイルが少ない場合は、最初のファイルを使用して完了できます。やり方は簡単で問題ありません。


コードは次のとおりです:

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';

しかし、ロードするファイルがたくさんある場合、これは大丈夫でしょうか? 10 個、20 個、またはそれ以上の require_once を記述する必要がある場合はどうすればよいでしょうか?

現時点では、autoload メソッドを使用してコードを簡素化できます。

autoload 読み込みの実装:
以下の内容の in.php ファイルを test ディレクトリに作成します。

コードは次のとおりです:

echo &#39;我是test下面的in.php<br />&#39;;

次に、次の内容のloader.phpをtestディレクトリに作成します。


コードは次のとおりです:

// 需要重载autoload方法,自定义包含类文件的路径  
function autoload($classname)  
{  
 $class_file = strtolower($classname).".php";  
 if (file_exists($class_file)){  
  require_once($class_file);  
 }  
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>

問題ありません、うまくいきました!ロード用に他のファイルを作成することもできますが、必要なファイルが多数あり、ディレクトリに分割する必要がある場合はどうすればよいでしょうか?

現時点では、ロードするファイルを見つけるためにマッピングを使用するように、loader.php を変更する必要があります。


コードは次のとおりです:

function autoload($class_name) {
 $map = array(
  &#39;index&#39; => &#39;./include/index.php&#39;,
  &#39;in&#39; => &#39;./in.php&#39;
 );
    if (file_exists($map[$class_name]) && isset($map[$class_name])) {
        require_once $map[$class_name];
    }
}
new index();

このメソッドの利点は、クラス名とファイル パスがマッピングによってのみ維持されるため、ファイル構造が変更された場合にクラス名を変更する必要がないことです。マッピング内の対応する項目のみを変更するだけで十分です。

ただし、自動ロードはプロジェクト内で 1 回しか使用できません。プロジェクトが他の人のプロジェクトを参照している場合、自分のプロジェクトにも自動ロードがあり、他の人のプロジェクトにも自動ロードがあるため、2 つの自動ロードが競合します。解決策は変更するだけです。これは間違いなく非常に面倒で、アプリケーション シナリオが 1 つだけになります。

spl の autoload ローディングの実装:
spl の autoload 一連の関数は、autoload 呼び出しスタックを使用し、spl_autoload_register を使用して、幅広いアプリケーション シナリオで複数のカスタマイズされた autoload 関数を登録できます


• test ディレクトリ test ディレクトリの下に次の内容の in.php を作成します

コードは次のとおりです:

<?php
class in {
 public function index() {
  echo &#39;我是test下面的in.php&#39;;
 }
}
?>

test ディレクトリの下に次の内容のloader.phpを作成します

コードは次のとおりです:

<?php
set_include_path("/var/www/test/"); //这里需要将路径放入include
spl_autoload("in"); //寻找/var/www/test/in.php
$in = new in();
$in->index();

•spl_autoload_register は関数を SPL オートロード関数スタックに登録し、loader.php を変更します

コードは次のとおりです:

function AutoLoad($class){
    if($class == &#39;in&#39;){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register(&#39;AutoLoad&#39;);
$a = new in();
$a->index();

•spl_autoload_register は複数のカスタマイズされたオートロード関数のアプリケーションを登録します
まず、 test ディレクトリに移動し、次の内容で inmod.mod.php を作成します:

コードは次のとおりです:

<?php
class inmod
{
 function construct()
 {
  echo &#39;我是mods下的in&#39;;
 }
}

次に、test ディレクトリに libs フォルダーを作成し、次の内容で inlib.lib.php を作成します:

コードは次のとおりです:

<?php
class inlib
{
 function construct()
 {
  echo &#39;我是libs下的in&#39;;
 }
}

最後に、次の内容のloader.phpをtestディレクトリに作成します

コードは次のとおりです:

<?php
class Loader {
    /**
    * 
自动加载类
    * @param $class 类名
    */
    public static function mods($class) {
        if($class){
   set_include_path( "/var/www/test/mods/" );
   spl_autoload_extensions( ".mod.php" );
   spl_autoload( strtolower($class) );
        }
    }
    public static function libs($class) {
  if($class){
   set_include_path( "/var/www/test/libs/" );
   spl_autoload_extensions( ".lib.php" );
   spl_autoload( strtolower($class) );
        }
    }
}
spl_autoload_register(array(&#39;Loader&#39;, &#39;mods&#39;));
spl_autoload_register(array(&#39;Loader&#39;, &#39;libs&#39;));
new inmod();//输出<SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是libs下的in</SPAN>

以上がPHPの自動読み込みメカニズムの詳細な研究の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。