この記事では主に PHP のリフレクションと自動ローディングについて紹介し、PHP のローディングの原理と自動ローディングの実装テクニックを例とともに分析します。
この記事の例では、PHP で遅延読み込みを実装する方法を説明します。皆さんの参考に共有してください。具体的な分析は以下の通りです:
通常のPHPの読み込みは、include()やrequire()などのメソッドで外部ファイルを読み込み、インスタンス経由でメソッドを呼び出したり、静的メソッドを直接呼び出したりするのですが、導入文を書くのは本当に面倒です。この方法では、フレームワークはすべてのファイルを特定のパスでインポートし、それらを直接インスタンス化して使用しますが、一部のクラス パッケージはこの方法では使用できない場合があります。ロードすると、プログラムのパフォーマンスに影響します。
PHP のリフレクション クラス ReflectionClass を通じて、対応するクラスのリフレクション クラスを直接取得できます:
test.php ファイルは次のとおりです:
<?php class test{ public function showName(){ var_dump(__CLASS__); } } ?>
index.php ファイルは次のとおりです:
<?php var_dump(get_included_files()); $rf = new ReflectionClass('test'); var_dump(get_included_files()); $testObj = $rf->newInstance(); $testObj->showName(); function __autoload($classname){ $classpath = './' . $classname . '.php'; if (file_exists($classpath)) { require_once($classpath); }else { echo 'class file'.$classpath.'not found!'; } } ?> //array // 0 => string 'D:\code\www\test\index.php'(length=26) //array // 0 => string 'D:\code\www\test\index.php'(length=26) // 1 => string 'D:\code\www\text\test.php'(length=25) //string 'test' (length=4)
ReflectionClass をインスタンス化し、クラス名を渡すと、対応するクラスのリフレクション クラスが取得されます。インスタンスを指定して newInstance を呼び出すと、リフレクション クラスのインスタンスが取得され、インスタンス化が完了します。
get_include_files() メソッドを通じて、現在のページで導入されているファイルを確認できます。リフレクション クラスをインスタンス化する前は、index.php ファイルのみが存在します。リフレクション クラスをインスタンス化すると、test.php ファイルが自動的に導入されます。このコードを見ると、__autoload() という名前のマジック メソッドがあることがわかります。メソッド 自動ロード ファイルが定義されており、ReflectionClass が現在のページでクラスを見つけられない場合、__autoload() を呼び出してクラスをロードします。これが自動ロードのプロセスです。
__autoload() メソッドが有効かどうかを知りたい場合は、PHP 標準ライブラリ SPL のメソッドを通じて確認できます:
var_dump(spl_autoload_functions()); spl_autoload_register('newAutoload'); var_dump(spl_autoload_functions()); $testObj1 = getInstance('test'); $testObj2 = getInstance('test'); $testObj3 = getInstance('test'); function getInstance($class, $returnInstance = false){ $rf = new ReflectionClass($class); if ($returnInstance) return $rf->newInstance(); } function newAutoload($classname){ $classpath = './' . $classname . '.php'; if (file_exists($classpath)) { var_dump('require success'); require_once($classpath); } else { echo 'class file ' . $classpath . ' not found!'; } } //array // 0 => string '__autoload' (length=10) //array // 0 => string 'newAutoload' (length=11) //string 'require success' (length=15)
sql_autoload_functions() メソッドは、現在の自動ロードを確認するために使用されます。現在、__autoload マジック メソッドがあるため、オートロード メソッドが定義されていない場合は false が返され、spl_autoload_register() メソッドはメソッド名を通じてメソッドをオートロード メソッドに登録します。 newAutoload メソッド_ _autoload メソッドに置き換えられました。
newAutoload メソッドでは、実行が成功するたびに、「require success」という文が出力されますが、ここでは 1 回だけ出力されます。これは、テスト クラスであるため、ReflectionClass('test') が 3 回インスタンス化されたことを示しています。一度ロードされると、自動ロードメソッドは実行されません。 getInstance() を使用してクラスをロードする方法は、以前の include() よりもはるかに便利です。 getInstance() メソッドが記述されたファイルをロードするだけです。
書き換えられた自動ロードメソッドは、必要に応じてクラス名を判断して異なるファイルパスを定義できます。 getInstance は静的変数を使用してインスタンスを保存できますが、これはデザイン パターンのシングルトン パターンも使用します。
関連する推奨事項:
PHP 自動読み込みオブジェクト (例として MVC フレームワークを使用)
以上がPHP リフレクションと自動ロードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。