ホームページ  >  記事  >  バックエンド開発  >  PHPのautoLoad自動読み込み機構の解析

PHPのautoLoad自動読み込み機構の解析

不言
不言オリジナル
2018-06-13 10:23:421376ブラウズ

この記事では主に PHP の autoLoad の自動読み込み機構の解析を紹介します。必要な方は参考にしてください。 PHP の autoload メソッドを使用します: __autoload メソッドと spl メソッド。これら 2 つのメソッドは使用方法が異なります。

__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' 
); 
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 があるため、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 は自動ロードを実装します: PHPのautoLoad自動読み込み機構の解析

/*http.php*/ 
<?php 
class http 
{ 
public function callname(){ 
echo "this is http"; 
} 
} 
/*test.php*/ 
<?php 
set_include_path("/home/yejianfeng/handcode/"); //这里需要将路径放入include 
spl_autoload("http"); //寻找/home/yejianfeng/handcode/http.php 
$a = new http(); 
$a->callname();

Spl_autoload_register

will 関数が登録されますSPL __autoload 関数スタックの例を直接見てみましょう。

/*http.php*/ 
<?php 
class http 
{ 
public function callname(){ 
echo "this is http"; 
} 
} 

/*test.php*/ 
<?php 
spl_autoload_register(function($class){ 
if($class == &#39;http&#39;){ 
require_once("/home/yejianfeng/handcode/http.php"); 
} 
}); 

$a = new http(); 
$a->callname(); 


spl_autoload_call

spl_autoload_register に登録されている呼び出し関数を呼び出します。次の例を見てください。

/*http.php*/ 
<?php 
class http 
{ 
public function callname(){ 
echo "this is http"; 
} 
} 
/*http2.php*/ 
<?php 
class http 
{ 
public function callname(){ 
echo "this is http2"; 
} 
} 

/*test.php*/ 
<?php 
spl_autoload_register(function($class){ 
if($class == &#39;http&#39;){ 
require_once("/home/yejianfeng/handcode/http.php"); 
} 
if($class == &#39;http2&#39;){ 
require_once("/home/yejianfeng/handcode/http2.php"); 
} 
}); 
spl_auto_call(&#39;http2&#39;); 
$a = new http(); 
$a->callname(); //这个时候会输出"this is http2"

spl_auto_register。 __autoload 自動ロード用のカスタム関数を使用できます。この方法は現在では一般的に使用されています。

Zend の AutoLoader モジュールはこのメソッドを使用します。対応するコードを抽出します。

spl_autoload_register(array(__CLASS__, &#39;autoload&#39;)); 

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

}

以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。


関連する推奨事項:

DateTime クラスに基づいて PHP で Unix タイムスタンプと日付を変換する問題を解決する方法

PHP で html_entity_decode を使用して HTML エンティティのエスケープを実装する


以上がPHPのautoLoad自動読み込み機構の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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