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 'b.php';
require_once 'c.php';
しかし、ロードするファイルがたくさんある場合、これで大丈夫でしょうか? 10 個、20 個、またはそれ以上の require_once を記述する必要がある場合はどうすればよいでしょうか?
__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)){
}
}
@$test = new in(); // ここで実行すると出力が出力されます。問題なく成功しました。ロード用に他のファイルを作成することもできますが、必要なファイルが多数あり、ディレクトリに分割する必要がある場合はどうすればよいでしょうか?
現時点では、ロードするファイルを見つけるためにマッピングを使用するように、loader.php を変更する必要があります。
[php]
関数 __autoload($class_name) {
'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'
);
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 です';
}
}
?>
を探しています
$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->index();
spl_autoload_register は複数のカスタム自動ロード関数を使用してアプリケーションを登録します
まず、test ディレクトリに mods フォルダーを作成し、次の内容で inmod.mod.php を作成します。
[php]
クラスinmod
関数 __construct()
{
echo '私はMOD中です';
}
}
クラスinmod
{
関数__construct()
{
echo '私は MOD を使用しています';
}
}
クラスインリブ
{
関数 __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){
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
true
http://www.bkjia.com/PHPjc/477470.html