ホームページ >php教程 >php手册 >PHP の autoLoad 自動読み込みメカニズムについて話しましょう

PHP の autoLoad 自動読み込みメカニズムについて話しましょう

WBOY
WBOYオリジナル
2016-06-13 11:57:13958ブラウズ

__autoload 1 の使用方法:
最も一般的に使用される方法は、クラス名に基づいてクラス ファイルを検索し、次に require_one

コードをコピーすることです コードは次のとおりです。


function __autoload($class_name) {
$path = str_replace('_', '/', $class_name); require_once $path . '.php';
}
// Http/File/Interface.php ファイルがここに自動的にロードされます
$a = new Http_File_Interface(); 🎜>この方法の利点は、シンプルで使いやすいことです。もちろん、欠点もあります。欠点は、ファイル構造を変更するときにクラス名とファイル パスを強制的に変更する必要があることです。

__autoload 2 の使い方 (ダイレクトマッピング方式)



コードをコピー

コードは以下の通りです: $map = array( 'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php'

); __autoload($class_name) {

if (isset($map[$class_name])) {
require_once $map[$class_name]
}
}
// C:/PHP/HTTP/FILE/ここに自動的にロードされます Interface.php ファイル
$a = new Http_File_Interface();



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

前の方法と比較したこの方法の欠点は、ファイルが多すぎる場合にマッピングを維持するのが非常に面倒なことです。おそらく、現時点では、メンテナンスのために json または別のファイルを使用することを検討するでしょう。おそらく、そのようなマッピングを維持または作成するためにフレームワークを使用することを考えるでしょう。



spl_autoload


__autoload の最大の欠点は、複数の autoload メソッドを持てないことです
OK、次のシナリオを考えてください。プロジェクトが参照しているのは、他の人のプロジェクトをコピーし、あなたのプロジェクトには __autoload があり、他の人のプロジェクトにも __autoload があるため、2 つの __autoload が競合します。解決策は __autoload を変更して 1 になるようにすることですが、これは間違いなく非常に面倒です。

したがって、spl の autoload シリーズ関数が表示されるように、autoload 呼び出しスタックを緊急に使用する必要があります。 spl_autoload_register を使用して複数のカスタム オートロード関数を登録できます

PHP バージョンが 5.1 以降の場合は、spl_autoload を使用できます

まず spl のいくつかの関数を理解してください:


spl_autoload は _autoload() のデフォルト実装であり、include_path で $class_name(.php/.inc) を検索します
Spl_autoload は自動ロードを実装します:



コードをコピーします

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

/*http.php*/ class http

{

public function callname( ){
echo "これは http";
}
}
/*test.php*/
set_include_path("/home/yejianfeng/handcode/ "); //ここでパスを include に入れる必要があります
spl_autoload("http"); ///home/yejianfeng/handcode/http.php を探します
$a = new http();
$ a->callname();



Spl_autoload_register

関数を SPL __autoload 関数スタックに登録します。例を直接見てください:




コードをコピーします

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

/*http.php*/ class http

{

public function callname(){
echo "これは http";
}
}

/*test.php*/
spl_autoload_register(function ($class){
if($class == 'http'){
require_once("/home/yejianfeng/handcode/http.php");
}
});

$a = new http();



spl_autoload_call

spl_autoload_register に登録されている呼び出し関数を呼び出します。以下の例を参照してください。



コードをコピーします

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

/ *http.php*/ class http {

public function callname(){

echo "これは http";
}
/*http2.php*/
class http
{
public function callname(){
echo "これは http2";
}

/*test.php*/
spl_autoload_register(function($class){
if($class == 'http'){
require_once("/home/yejianfeng/handcode/http.php");
}
if($class == 'http2'){
require_once("/home/yejianfeng/handcode/http2.php ");
}
}) ;
spl_auto_call('http2');
$a = new http();
$a->callname(); //これで今度は、「this is http2」が出力されます


spl_auto_register 関数を使用すると、__autoload を使用せずに自動ロードにカスタム関数を使用できるようになります。この方法は現在では一般的に使用されています。
Zend の AutoLoader モジュールはこのメソッドを使用します。対応するコードを抜粋します

コードをコピーします コードは次のとおりです:


spl_autoload_register(array(__CLASS__, 'autoload') );

public static function autoload($class)
{
…..

}



推奨されるリファレンス記事:
zend のオートロード機構については、前の記事 http://www.jb51.net/article/31399.htm に詳細な分析があります。
autoload の自動読み込みの仕組みについては、こちらの記事 http://www.jb51.net/article/31279.htm で最下層から詳しく説明されています。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。