phpでのspl_autoloadの詳しい説明、spl_autoload_PHPチュートリアルの詳しい説明

WBOY
リリース: 2016-07-13 10:16:57
オリジナル
816 人が閲覧しました

phpでのspl_autoloadの詳しい説明、spl_autoloadの詳しい説明

SPL には spl_autoload と spl_autoload_call という 2 つの異なる関数があり、autoload_func をこれら 2 つの異なる関数アドレスに指定することで、異なる自動ロード メカニズムが実装されます。

spl_autoload は SPL によって実装されるデフォルトの自動ロード関数であり、その機能は比較的単純です。 2 つのパラメータを受け取ることができます。最初のパラメータはクラス名を表します。2 番目のパラメータ $file_extensions は、「title="Extension">Extension」にあります。 $file_extensions" title="拡張子">拡張子名で複数の拡張子を指定します。セミコロンで区切ってください。指定しない場合は、デフォルトの拡張子"title="拡張子名"> .inc または spl_autoload が使用されます。最初に $class_name を小文字に変更し、次にすべてのインクルード パスで $class_name.inc または $class_name.php ファイルを検索します ($file_extensions パラメーターが指定されていない場合)。見つかった場合は、クラス ファイルを手動でロードします。spl_autoload を使用できます。 ("person", ".class.php") は、実際には、複数の拡張子を指定できることを除いて、require/include に似ています。

spl_autoload を自動的に動作させる、つまり autoload_func を spl_autoload にポイントする方法は?答えは、spl_autoload_register 関数を使用することです。 PHP スクリプトで初めてパラメータを指定せずに spl_autoload_register() を呼び出すと、autoload_func を spl_autoload に指定できます。

上記の説明を通じて、spl_autoload の機能は比較的単純であり、SPL 拡張機能で実装されており、その機能を拡張できないことがわかりました。独自のより柔軟な自動読み込みメカニズムを実装したい場合はどうすればよいでしょうか?この時点で、spl_autoload_call 関数がデビューします。

まず、spl_autoload_call の実装の素晴らしい機能を見てみましょう。 SPL モジュール内には、本質的に HashTable であるグローバル変数 autoload_functions がありますが、リンク リスト内の各要素は、次の機能を持つ関数を指す関数ポインターであると単純に考えることができます。クラスの自動ロード機能。 spl_autoload_call の実装自体は非常に単純で、リンクされたリスト内の各関数を順番に実行し、各関数の実行後に必要なクラスがロードされたかどうかを判断し、ロードが成功した場合はそのままリターンします。リンクされたリストの他の機能を実行し続けます。このリンク リスト内のすべての関数が実行された後でクラスがロードされていない場合、spl_autoload_call はユーザーにエラーを報告せずに直接終了します。したがって、オートロード メカニズムを使用しても、クラスが自動的に正しくロードされることは保証されません。キーはオートロード関数の実装方法に依存します。

php5 の標準ライブラリ メソッド spl_autoload は、独自の __autoload を実装するのと同等です

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

関数 __autoload($classname){
if(is_file($classname.'.php'){
include $classname.'.php';
} elseif(is_file($classname.'.inc'){
$classname.'.inc';
を含めます }
}

登録ディレクトリ内で $classname と同じ名前の .php/.inc ファイルが自動的に検索されます。もちろん、拡張子を登録して特定の種類のファイルを指定することもできます

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

spl_autoload_extensions('.php,.inc,.some');

この方法では、.some ファイルも検索されます。デフォルトでは、php は spl_autoload を開始しません。では、spl_autoload を自動的に有効にするにはどうすればよいでしょうか?その方法は

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

spl_autoload_register();

spl_autoload_register には $callback パラメータがあり、指定しない場合は、さらに自動ロード ディレクトリを検索するために、これらのコードの前に自動ロード ディレクトリを設定できます

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

set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

このように、phpは指定されたクラスが見つからない場合、set_include_pathで指定されたディレクトリ内を検索します。

これらのメソッドは php フレームワークで一般的に使用されます。たとえば、上記の紹介文をつなぎ合わせます:

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

set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
spl_autoload_extensions('.php,.inc,.some');
spl_autoload_register();

some/path の下に classA クラスをロードする場合、ディレクトリ内で classa.php または classa.inc または classa.some が検索されるため、新しい classA を安全に使用したり、classA を拡張したりできます

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

ClassB は ClassA を拡張します {
// コード..
}

$a = 新しいクラスA;
$b = 新しいクラス B;

PHP での spl_autoload_register と spl_autoload_unregister の使用法を教えます

これは __autoload などのオートロードに似た PHP 関数ですが、NEW 中に独自に定義した関数を呼び出したい場合は、
spl_autoload_register
を使用できます。

至急、PHPの__autoload関数とspl_autoload_register()関数についてネットで調べても理解できなかったので教えてください

__autoloadはクラスライブラリの自動読み込みによく使われます
これは、クラス名に従ってクラスファイルを見つけて、require_one
spl_autoload_register()するという方法です

__autoloadの最大の欠点は、複数のファイルをロードできないことです。 autoload メソッド

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

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

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/895115.html技術記事 php での spl_autoload の詳細な説明、spl_autoload の詳細な説明 SPL には spl_autoload、spl_autoload_call という 2 つの異なる関数があり、これら 2 つの異なる関数のアドレスを autoload_func に指定することで、異なる機能を実現できます...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート