PHPのクラス自動読み込みの仕組み_PHPチュートリアル

WBOY
リリース: 2016-07-13 17:50:04
オリジナル
784 人が閲覧しました

PHP の開発プロセスで、外部からクラスを導入する場合は、通常、include メソッドと require メソッドを使用して、クラスを定義するファイルをインクルードします。小規模に開発する場合には大きな問題はありません。ただし、大規模な開発プロジェクトでは、これを行うと大量の require または include メソッド呼び出しが生成され、効率が低下するだけでなく、コードの保守が困難になり、require_once のコストが非常に高くなります。

PHP5 より前は、各 PHP フレームワークがクラ​​スの自動ロードを実装したい場合、通常、ディレクトリを横断し、特定の取り決めに従って合意されたルールに準拠するすべてのファイルを自動的にロードするクラスまたは関数を実装していました。 もちろん、PHP5 より前のオブジェクト指向のサポートはあまり良くなく、クラスの使用は現在ほど頻繁ではありませんでした。 PHP5 以降では、PHP クラスをロードするときに、クラスが配置されているファイルが含まれていない場合、またはクラス名が間違っている場合、Zend エンジンは自動的に __autoload 関数を呼び出します。この関数を使用するには、ユーザーが自分で __autoload 関数を実装する必要があります。 PHP5.1.2以降では、spl_autoload_register関数を使用して自動ロード処理機能をカスタマイズできるようになりました。この関数が呼び出されない場合、SPL のカスタム spl_autoload 関数がデフォルトで使用されます。

1. __自動ロードの例:

関数 __autoload($class_name) {
echo '__autload class:', $class_name, '
'; }

新しいデモ(); 上記のコードは最後に __autload class:Demo を出力します。
その後、エラー メッセージが表示されます: 致命的なエラー: クラス「デモ」が見つかりません

通常、次のように _autoload を使用してクラスを自動的にロードします。

関数 __autoload($class_name) {
require_once ($class_name . “class.php”); }
$memo= 新しいデモ
; _autoload は少なくとも 3 つのことを行う必要があることがわかります。1 つ目は、クラス名に基づいてクラス ファイル名を決定することです。2 つ目は、クラス ファイルが配置されているディスク パスを決定することです (この例では、最も単純なケースでは、クラスを呼び出す PHP プログラム ファイルと同じフォルダーにあります)。3 番目の方法は、クラスをディスク ファイルからシステムにロードすることです。 3 番目のステップは最も単純で、include/require を使用するだけです。第 1 ステップと第 2 ステップの機能を実現するには、クラス名とディスク ファイル間のマッピング方法を開発時に合意する必要があります。この方法でのみ、クラス名に基づいて対応するディスク ファイルを見つけることができます。

したがって、含めるクラス ファイルが多数ある場合は、対応するルールを決定し、__autoload() 関数でクラス名と実際のディスク ファイルを一致させるだけで、遅延読み込み効果を実現できます。ここから、 __autoload() 関数の実装で最も重要なことは、クラス名と実際のディスク ファイルの間のマッピング ルールの実装であることもわかります。

しかし、ここで問題が発生します。システムの実装で他の多くのクラス ライブラリを使用する必要がある場合、これらのクラス ライブラリは異なる開発エンジニアによって開発され、クラス名と実際のディスク ファイルの間のマッピング ルールが異なる可能性があります。 。現時点で、クラス ライブラリ ファイルの自動ロードを実装したい場合は、すべてのマッピング ルールを __autoload() 関数に実装する必要があります。そのため、__autoload() 関数は非常に複雑になるか、実装が不可能になる可能性があります。最終的に、__autoload() 関数は、たとえ実装できたとしても非常に肥大化する可能性があり、将来のメンテナンスとシステム効率に大きな悪影響を及ぼします。この場合、PHP5 では SPL 標準ライブラリ、新しいソリューションである spl_autoload_register() 関数が導入されています。

2. spl_autoload_register() 関数

この関数の機能は、関数を SPL の __autoload 関数スタックに登録し、システムのデフォルトの __autoload() 関数を削除することです。これは以下の例で見ることができます:

function __autoload($class_name) {

echo '__autload class:', $class_name, '
'; }

関数 classLoader($class_name) {
echo 'SPL ロード クラス:', $class_name, '
'; }
spl_autoload_register('クラスローダー'); new Test();//結果:SPL ロード クラス:Test 構文: bool spl_autoload_register ([callback $autoload_function]) 2 つのパラメータを受け入れます。1 つはオートロード スタックに追加される関数で、もう 1 つはローダーがこのクラスを見つけられない場合に例外をスローするかどうかを示すフラグです。最初の引数はオプションで、デフォルトでは spl_autoload() 関数を指します。この関数は、小文字のクラス名と .php 拡張子または .ini 拡張子、あるいは spl_autoload_extensions( ) という名前のファイル。


クラス CalssLoader
{
パブリック静的関数ローダー($classname)
                                             $class_file = strto lower($classname).".php";
If (file_exists($class_file)){
require_once($class_file);                                                                                                                                                        }
//メソッドは静的メソッドです
spl_autoload_register('CalssLoader::loader'); $test = 新しいテスト(); spl_autoload_register() 関数が呼び出されると、未定義のクラスが呼び出されるとき、システムは __autoload() 関数を自動的に呼び出すのではなく、spl_autoload_register() 関数に登録されているすべての関数を順番に呼び出します。この状況を回避したい場合は、 spl_autoload_register() 関数のより安全な初期化呼び出しメソッドを使用する必要があります:

if(false === spl_autoload_functions()){
If(function_exists('__autoload')){
spl_autoload_registe('__autoload',false);                                                                         }
spl_autoload_functions() 関数は、登録された関数の配列を返します。SPL 自動ロード スタックが初期化されていない場合は、ブール値 false を返します。次に、__autoload() という名前の関数が存在するかどうかを確認します。存在する場合は、それを自動ロード スタックの最初の関数として登録し、その機能を保持できます。その後、引き続きオートロード機能を登録できます。

関数に文字列名を指定する代わりに、spl_autoload_register() 関数を呼び出してコールバック関数を登録することもできます。たとえば、array('class','method') などの配列を指定すると、オブジェクトのメソッドを使用できるようになります。


次に、 spl_autoload_call('className') 関数を呼び出すことで、そのクラスを使用せずにローダーを手動で呼び出すことができます。この関数を class_exists('className',false) と組み合わせて使用​​すると、クラスのロードを試行し、すべてのオートローダーがクラスを見つけられない場合は失敗します。

f(spl_autoload_call('className') && class_exists('className',false)){

} else {

                                                                             SPL オートロード関数は、spl_autoload()、spl_autoload_register()、spl_autoload_functions()、spl_autoload_extensions()、および spl_autoload_call() 関数によって提供されます。

(ネットワークコンテンツの概要)

Programming Life、guisuコラムより抜粋




http://www.bkjia.com/PHPjc/478291.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/478291.html

技術記事 PHP の開発プロセスで、外部からクラスを導入する場合は、通常、include メソッドと require メソッドを使用して、クラスを定義するファイルをインクルードします。これが小規模に開発されたとき...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート