PHPの自動読み込み機構_PHPチュートリアル

WBOY
リリース: 2016-07-14 10:10:32
オリジナル
911 人が閲覧しました

1. phpで自動読み込みを実装する方法

手動でロードするには、require、include、require_once、include_once を使用します。

自動読み込みには __autoload を使用します
spl の autoload を使用して自動読み込みを実現します
手動ローディングの実装:

ロードするファイルが少ない場合は、最初のファイルを使用できます。それは簡単で問題ありません。


[php]
require_once 'a.php'; require_once 'b.php'
; require_once 'c.php'
;

require_once 'a.php';

require_once 'b.php';
require_once 'c.php';
しかし、ロードするファイルがたくさんある場合、これで大丈夫でしょうか? 10 個、20 個、またはそれ以上の require_once を記述する必要がある場合はどうすればよいでしょうか?

現時点では、__autoload メソッドを使用してコードを簡素化できます。

__autoload 読み込み実装:

次の内容の in.php ファイルを test ディレクトリに作成します。

[php]
echo '私は .php をテスト中です
';
echo 'I am in.php under test
'; 次に、次の内容のloader.phpをtestディレクトリに作成します。

[php]

// __autoload メソッドをオーバーロードし、クラス ファイルを含むパスをカスタマイズする必要があります

関数 __autoload($classname)
{
$class_file = strto lower($classname).".php"; If (file_exists($class_file)){
require_once($class_file); }
}
@$test = new in(); // ここで実行すると、I am in.php under test
// __autoload メソッドをオーバーロードし、クラス ファイルを含むパスをカスタマイズする必要があります
関数 __autoload($classname)
{
$class_file = strto lower($classname).".php"; if (file_exists($class_file)){

require_once($class_file)

}
}
@$test = new in(); // ここで実行すると出力が出力されます。問題なく成功しました。ロード用に他のファイルを作成することもできますが、必要なファイルが多数あり、ディレクトリに分割する必要がある場合はどうすればよいでしょうか?

現時点では、ロードするファイルを見つけるためにマッピングを使用するように、loader.php を変更する必要があります。


[php]
関数 __autoload($class_name) {

$map = 配列(

'index' => './include/index.php',

'in' => './in.php'

);

If (file_exists($map[$class_name]) && isset($map[$class_name])) {
require_once $map[$class_name]
}
}
新しいインデックス();
関数 __autoload($class_name) {
$map = 配列(
'インデックス' => './include/index.php',
'in' => './in.php'
);

if (file_exists($map[$class_name]) && isset($map[$class_name])) {

require_once $map[$class_name];
}
}
新しいインデックス();

この方法の利点は、クラス名とファイル パスがマッピングでのみ維持されるため、ファイル構造が変更された場合にクラス名を変更する必要がなく、マッピング内の対応する項目のみを変更する必要があることです。


ただし、__autoload はプロジェクト内で 1 回しか使用できません。自分のプロジェクトが他の人のプロジェクトを参照している場合、自分のプロジェクトにも __autoload があり、他の人のプロジェクトにも __autoload が存在するため、2 つの __autoload が競合します。これは間違いなく非常に面倒であり、アプリケーションのシナリオが 1 つだけになります。


spl のオートロード読み込み実装:

spl の autoload シリーズは、autoload 呼び出しスタックを使用します。spl_autoload_register を使用して、幅広いアプリケーション シナリオを持つ複数のカスタマイズされた autoload 関数を登録できます。

spl

の関連機能を自動的にロード spl_autoload は、_autoload() のデフォルトの実装です。Spl_autoload は、include_path で $class_name(.php/.inc) を探します。 以下の内容の in.php を test ディレクトリに作成します


[php]
{
のクラス パブリック関数 Index() {
echo '私はテスト中の .php です'; }
}
?>

{
のクラス パブリック関数 Index() {
echo '私はテスト中の .php です';
}
}
?> 以下の内容のloader.phpをtestディレクトリに作成します
[html]
set_include_path("/var/www/test/"); //ここにパスを含める必要があります
spl_autoload("in"); ///var/www/test/in.php を探します
$in = 新しい in(); $in->index();
set_include_path("/var/www/test/"); // include にパスを入れる必要があります

spl_autoload("in"); ///var/www/test/in.php

を探しています $in = 新しい in();
$in->index();
spl_autoload_register は関数を SPL __autoload 関数スタックに登録し、loader.php を変更します
[php]
関数 AutoLoad($class){
If($class == 'in'){
require_once("/var/www/test/in.php"); }
}
spl_autoload_register('AutoLoad'); $a = 新しい in(); $a->index();
関数 AutoLoad($class){
If($class == 'in'){
require_once("/var/www/test/in.php");
}
}
spl_autoload_register('AutoLoad');

$a = 新しい in();

$a->index();



spl_autoload_register は複数のカスタム自動ロード関数を使用してアプリケーションを登録します
まず、test ディレクトリに mods フォルダーを作成し、次の内容で inmod.mod.php を作成します。 [php]
クラスinmod

{

関数 __construct()

{

echo '私はMOD中です'; }
}

クラスinmod
{
関数__construct()
{
echo '私は MOD を使用しています';
}
}

次に、test ディレクトリに libs フォルダーを作成し、次の内容の inlib.lib.php を作成します。 [php]

クラスインリブ
{
関数 __construct()
{
echo '私はライブラリの下にいます'; }
}

クラスインリブ
{
関数__construct()
{
echo '私はライブラリの下にいます';
}
} 最後に、test ディレクトリに次の内容のloader.phpを作成します
[php]
クラスローダー {
/**
* クラスを自動的にロードします
* @param $class クラス名
​*/
パブリック静的関数 mods($class) {
if($class){
set_include_path( "/var/www/test/mods/" ); spl_autoload_extensions( ".mod.php" ); spl_autoload( strto lower($class) ); }
}
パブリック静的関数 libs($class) {
if($class){
set_include_path( "/var/www/test/libs/" ); spl_autoload_extensions( ".lib.php" ); spl_autoload( strto lower($class) ); }
}
}
spl_autoload_register(array('ローダー', 'mods')); spl_autoload_register(array('Loader', 'libs')); new inmod();//出力 で MOD を導入しています。 new inlib();//
クラスローダー{
/**
* クラスを自動的にロードします
* @param $class クラス名
​*/
パブリック静的関数 mods($class) {
if($class){

set_include_path( "/var/www/test/mods/" );

spl_autoload_extensions( ".mod.php" );
spl_autoload( strto lower($class) );
}
}
パブリック静的関数 libs($class) {
if($class){
set_include_path( "/var/www/test/libs/" );
spl_autoload_extensions( ".lib.php" );
spl_autoload( strto lower($class) );
}
}
}
spl_autoload_register(array('Loader', 'mods'));
spl_autoload_register(array('Loader', 'libs'));
new inmod();//MOD の下にある出力
new inlib();//出力は libs の下にあります






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

www.bkjia.com

tru​​e

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

技術記事 1. PHP で自動ロードを実装する方法は、require、include、require_once、および include_once を使用して手動でロードすることです。 自動ロードには __autoload を使用します。spl の autoload を使用して実装します...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート