ホームページ  >  記事  >  バックエンド開発  >  PHP の autoLoad 自動読み込み機構について話しましょう_PHP チュートリアル

PHP の autoLoad 自動読み込み機構について話しましょう_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:15:24803ブラウズ

__autoload の使用方法 1:
最もよく使用される方法は、クラス名に基づいてクラス ファイルを見つけて、require_one

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

function __autoload ($class_name) {
$path = str_replace('_', '/', $class_name);
require_once $path .
}
// Http/File/Interface.php ファイルが自動的に作成されます。ここにロードされます
$a = new Http_File_Interface();

このメソッドの利点は、シンプルで使いやすいことです。もちろん、欠点もあります。欠点は、ファイル構造を変更するときにクラス名とファイル パスを強制的に変更する必要があることです。

__autoloadの利用方法2(ダイレクトマッピング方式)
コードをコピー コードは以下の通りです:

$map = array(
'Http_File_Interface' => 'C:/PHP/HTTP /FILE/ Interface.php'
);
function __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 メソッドを持てないことです

さて、次のシナリオを考えてください。あなたのプロジェクトには __autoload があり、他の誰かがいます。プロジェクトには __autoload も含まれているため、2 つの __autoload が競合します。解決策は __autoload を変更して 1 になるようにすることですが、これは間違いなく非常に面倒です。

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

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

まず spl のいくつかの関数を理解します:
PHP の autoLoad 自動読み込み機構について話しましょう_PHP チュートリアル

spl_autoload は _autoload() 実装のデフォルトです。 include_path
Spl_autoload で $class_name(.php/.inc) を探して自動読み込みを実装します:
コードをコピー コードは次のとおりです:

/*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(); );


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")
}
}); ->callname();



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(); //このとき、「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 で最下層から詳しく説明されています。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/326121.html技術記事 __autoload の使用方法 1: このメソッドは、クラス名に基づいてクラス ファイルを検索し、コードを次のようにコピーします: function __autoload($class_name)...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。