ホームページ >バックエンド開発 >PHPチュートリアル >PHPマジック関数__autoload_PHPの使い方と問題点チュートリアル

PHPマジック関数__autoload_PHPの使い方と問題点チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:56:27955ブラウズ

今回はphp5の新機能である__autoloadの使い方と問題点について紹介します。

__autoload() の使用法

PHPマニュアルのいくつかの教え

オブジェクトの自動読み込み
オブジェクト指向アプリケーションを作成する多くの開発者は、クラス定義ごとに PHP ソース ファイルを作成します。大きな煩わしさは、各スクリプトの先頭にインクルード ファイルの長いリスト (クラスごとに 1 つのファイル) を記述しなければならないことです。

PHP 5 では、これは必要なくなりました。まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される __autoload 関数を定義できます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。

注:

__autoload 関数でスローされた例外は、catch ステートメント ブロックではキャッチできず、致命的なエラーが発生します。


注:

PHP の CLI インタラクティブ モードを使用する場合、オートロードは存在しません。

例 #1 自動ロードの例

この例では、MyClass1.php ファイルと MyClass2.php ファイルからそれぞれ MyClass1 クラスと MyClass2 クラスをロードしようとします。

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

関数 __autoload($class_name) {
require_once $class_name .php';
}

$obj = 新しい MyClass1();
$obj2 = 新しい MyClass2();
?>

PHP マジック関数 __autoload() メソッドが登場する前は、プログラム ファイル内で 100 個のオブジェクトをインスタンス化したい場合、include または require を使用して 100 個のクラス ファイルをインクルードするか、これらの 100 個のクラスを同じクラス ファイル内で定義する必要がありました。このファイルは非常に大きくなると思います。
ただし、 __autoload() メソッドを使用すると、オブジェクトをインスタンス化する前に、このクラスが指定されたファイルを自動的にロードします。

例を通して具体的な使い方を見ていき、PHPのマジック関数__autoloadを使う際の注意点については後ほど説明します。

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


//クラスClassAを定義し、ファイル名はClassA.php
クラスクラスA{
パブリック関数 __construct(){
echo "ClassA ロード成功!";
}
}

//クラス ClassB を定義します。ファイル名は ClassB.php です。ClassB は ClassA を継承します
クラス ClassB は ClassA を拡張します {
パブリック関数 __construct(){
//parent::__construct();
echo "ClassB ロード成功!";
}
}

テスト用に 2 つのクラスを定義した後、次のように __autoload() メソッドを含む PHP 実行プログラム ファイルを作成しましょう:

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

関数 __autoload($classname){
$classpath="./".$classname.'.php';
if(file_exists($classpath)){
require_once($classpath);
}
他{
echo 'クラスファイル'.$classpath.'見つかりません!';
}
}

$newobj = 新しい ClassA();
$newobj = 新しい ClassB();

このファイルの実行にはまったく問題はありません。これは、autoload がいかに使いやすいかを示しています (笑)...
ただし、注意しなければならない点がいくつかあることを思い出してください。

1. クラスに継承関係があり (例: ClassB が ClassA を拡張する)、ClassB が存在するディレクトリに ClassA が存在しない場合
__autoload マジック関数を使用して ClassB をインスタンス化すると、致命的なエラーが発生します:
致命的なエラー: クラス 'Classd' が ......ClassB.php の 2 行目に見つかりません、

解決策: extends 関係を持つすべてのクラスを同じファイル ディレクトリに配置するか、継承されたクラスをインスタンス化するときに継承されたクラスをファイルに手動で含めます。

2. もう 1 つの注意点は、マジック関数 __autoload をより便利に使用できるように、クラス名とクラス ファイル名が一致している必要があることです。

その他の注意事項:

3. このメソッドは、PHP スクリプトを CLI モードで実行する場合は無効です。

4. クラス名がユーザー入力に関連している場合、またはユーザー入力に依存している場合は、必ず入力ファイル名を確認してください。例: .././ このようなファイル名は非常に危険です。

__オートロードの問題

__autoload マジック メソッド、あるいはマジック関数と呼びたいのですが、それは具体的すぎます。インクルードする必要があるクラス ファイルをロードするとき、クラス定義以外のクラス ファイル内の他のステートメントは考慮されません。

このメカニズムのリプレイを開始してください。

まず、Test.class.php ファイルを作成し、次の内容を入力します

$publicPara='中国共産党第17回党大会はいつ開催されますか? ';

コードは次のとおりですコードをコピークラステスト{ パブリック関数 __construct(){ グローバル $publicPara;このファイルを忘れずに保存してください。
if(isset($publicPara)){
エコー $publicPara;
}
他{
echo 「私のことをどう思っているの?」;
}
}
}



次に、do.php という名前のファイルを再作成し、次の内容を入力します

コードは次のとおりですコードをコピー require_once('Test.class.php'); 新しいテスト(); しかし、魔法のメソッド __autoload を使用すると問題が発生します



この場合、出力は予想どおりです: 中国共産党第 17 回全国代表大会はいつ開催されますか?

コードは次のとおりです

コードをコピー require_once($classname.".class.php"); }明らかに、彼はクラスの外で定義した変数を無視しました。つまり、他の宣言に関係なく、シリアル化する必要があるクラスのみをロードしました。それは単にechoなどの他の宣言でした
関数 __autoload($classname){
新しいテスト();



今回の入力は実際には次のとおりです: 私のことをどう思っていますか?

http://www.bkjia.com/PHPjc/632162.htmlwww.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/632162.html技術記事この記事では、php5 の新機能である __autoload の使い方と問題点を紹介します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。