ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルでの SPL spl_autoload_register および __autoload メソッドの使用

php_PHP チュートリアルでの SPL spl_autoload_register および __autoload メソッドの使用

WBOY
WBOYオリジナル
2016-07-20 10:59:071088ブラウズ

PHP では、spl_autoload_register メソッドと __autoload メソッドは PHP5 でのみ使用できます。これら 2 つの魔法の関数の使用方法について詳しく説明します。 ​

spl_autoload_register() 関数は、主流のフレームワークで最も使用されている非常に中心的な関数の 1 つであり、関数とクラスを自動的に登録し、__autoload() に似た関数を実装し、クラスの呼び出しと読み込みを簡素化し、作業効率を向上させることができます。 。

サポートされているバージョン: PHP 5 >= 5.1.2

効率の問題に関しては。 PHP マニュアルには次のように書かれています:

bool spl_autoload_register ([ callback $autoload_function ] )

関数を SPL __autoload 関数スタックに登録します。このスタック内の関数がまだアクティブになっていない場合は、アクティブにします。 __autoload 関数がプログラムに実装されている場合は、__autoload スタックに明示的に登録する必要があります。 spl_autoload_register() 関数は、Zend Engine の __autoload 関数を spl_autoload() または spl_autoload_call() に置き換えるためです。

spl_autoload_register
(PHP 5 >= 5.1.2)
spl_autoload_register — __autoload() 関数を登録する
説明
bool spl_autoload_register ([ callback $autoload_function ] )
関数を SPL __autoload 関数スタックに登録します。このスタック内の関数がまだアクティブになっていない場合は、アクティブにします。
__autoload 関数がプログラムに実装されている場合は、__autoload スタックに明示的に登録する必要があります。なぜなら
spl_autoload_register() 関数は、Zend Engine の __autoload 関数を spl_autoload() または
に置き換えます。 spl_autoload_call()。
パラメータ
自動ロード関数
登録するオートロード関数。パラメーターが指定されていない場合、autoload のデフォルト実装関数が自動的に登録されます
spl_autoload()。
戻り値
成功した場合は TRUE、失敗した場合は FALSE を返します。
注: SPL は、Standard PHP Library の略称です。これは、PHP5 で導入された拡張ライブラリであり、その主な機能には、オートロード メカニズムとさまざまな Iterator インターフェイスまたはクラスの実装が含まれます。 SPL オートロード メカニズムは、関数ポインタ autoload_func をオートロード関数を持つ自己実装関数にポイントすることによって実装されます。 SPL には、spl_autoload と spl_autoload_call という 2 つの異なる関数があります。これら 2 つの異なる関数アドレスを autoload_func に指定することで、異なる自動ロード メカニズムが実装されます。

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

クラスの自動ロード
{
パブリック静的関数load( $クラス名 )
{
$filename = $classname.".class.php";
If (file_exists($filename)) {
require_once $filename ;
}
}
}

関数 __autoload( $クラス名 )
{
// これはデフォルトの自動ロード方法です
$filename = $classname.".class.php";
If (file_exists($filename)) {
require_once $filename ;
}
}

//オートローダーを登録します
spl_autoload_register( 'autoload::load' );
spl_autoload_register( '__autoload' );
// 注: 次のクラスは未定義のように見えますが、実際には、システムは sql_autoload_register によって提供されるパスに従って自動的に検索します
//foo.class.php ファイルが見つからない場合はエラーが報告されます。
$foo = 新しい foo();
$foo ->bar();
?>

さらに:

__autoload メソッドは、autoload_func 関数ポインタがすでに spl_autoload メソッドを指しているため、spl_autoload_register の後は無効になります
* 次の方法で _autoload メソッドを autoload_functions リストに追加できます

spl_autoload_register( '__autoload' );

カスタム読み込みメソッドを使用することもできます:

最初の関数式:

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

関数 my_own_loader($classname)
{
$class_file = strto lower($classname).".php";
If (file_exists($class_file)){
require_once($class_file);
}
}

spl_autoload_register("my_own_loader");

$a = 新しい A();

2 番目のタイプ:

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

クラスローダー
{
パブリック静的関数 my_own_loader($classname)
{
$class_file = strto lower($classname).".php";
If (file_exists($class_file)){
require_once($class_file);
}
}
}

// クラスとメソッドの名前を配列の形式で渡します
spl_autoload_register(array("ローダー","my_own_loader"));
$a = 新しい A();

例: CI フレームワークがクラ​​スローディングを実装すると、それに対応するモデルも生成されます。

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

静的パブリック関数 myAutoload($class){
if(file_exists(APPPATH.'models'.DIRECATORY_SEPARATOR.$class.'.php')){
require_once APPPATH.'models'.DIRECATORY_SEPARATOR.$class.'.php';
}
}
/**
* レジスターローダー
*/
静的パブリック関数 autoload(){
spl_autoload_register(array(__CLASS__, 'myAutoload'));
if(class_exists('__autoload')){
spl_autoload_register('__autoload');
}
}
MY_Controller::autoload();


もちろん、上記は最も単純なデモにすぎません。__autoload は include_path に移動してクラス ファイルを見つけ、それをロードするだけです。必要に応じて __autoload のルールを定義できます。

さらに、自動ロード時に __autoload を呼び出すのではなく、独自の関数 (またはクラス メソッド) を呼び出したい場合は、 spl_autoload_register を使用して独自の autoload 関数を登録できます。その関数プロトタイプは次のとおりです:
bool spl_autoload_register ( [callback $autoload_function] )

上記の例を書き直してみましょう:

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

クリップボード印刷へのプレーンコピーを表示しますか?
関数ローダー($class)
{
$file = $class
; if (is_file($file)) {
require_once($file)
}
}

spl_autoload_register('ローダー');

$a = 新しい A();

関数ローダー($class) {
$file = $class .php';
if (is_file($file)) {
require_once($file);
}
}

spl_autoload_register('ローダー');

$a = 新しい A();

このようにして、PHP がクラスを探すときに、__autoload を呼び出すのではなく、独自に定義した関数ローダーを呼び出すこともできます。同様の理由で、以下のような書き方も可能です

コードは次のとおりですコードをコピー
クリップボード印刷へのプレーンコピーを表示しますか?

クラスローダー
{
パブリック静的関数loadClass($class)
{
$file = $class
; if (is_file($file)) {
require_once($file)
}
}
}

spl_autoload_register(array('Loader', 'loadClass'));

$a = 新しい A();


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

tru​​ehttp://www.bkjia.com/PHPjc/445632.html技術記事 PHP では、spl_autoload_register メソッドと __autoload メソッドは PHP5 でのみ使用できます。これら 2 つの魔法の関数の使用方法について詳しく説明します。 spl_autoload_reg...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。