PHP __autoload と spl_autoload

WBOY
WBOYオリジナル
2016-07-29 09:04:181379ブラウズ
__autoload の最大の欠点は、複数の autoload メソッドを持てないことです。
次のシナリオについて考えてみましょう。あなたのプロジェクトには __autoload があり、他の人のプロジェクトにも __autoload が存在します。このように、2 つの __autoload が競合します。解決策は __autoload を変更して 1 になるようにすることですが、これは間違いなく非常に面倒です。

したがって、spl の autoload シリーズ関数が表示されるように、autoload 呼び出しスタックを緊急に使用する必要があります。 spl_autoload_register を使用して、複数のカスタム自動ロード関数を登録できます。

PHP バージョンが 5.1 以降の場合は、spl_autoload を使用できます。まず、spl のいくつかの関数を理解します。

PHP __autoload与spl_autoload

spl_autoload は _autoload() のデフォルト実装であり、include_path で $class_name(.php/.inc) を探します

実際にはプロジェクトの通常のメソッドは次のとおりです (クラスが見つからない場合にのみ呼び出されます):

  // Example to auto-load class files from multiple directories using the SPL_AUTOLOAD_REGISTER method.
    // It auto-loads any file it finds starting with class.<classname>.php (LOWERCASE), eg: class.from.php, class.db.php
    spl_autoload_register(function($class_name) {

        // Define an array of directories in the order of their priority to iterate through.
        $dirs = array(
            'project/', // Project specific classes (+Core Overrides)
            'classes/', // Core classes example
            'tests/',   // Unit test classes, if using PHP-Unit
        );

        // Looping through each directory to load all the class files. It will only require a file once.
        // If it finds the same class in a directory later on, IT WILL IGNORE IT! Because of that require once!
        foreach( $dirs as $dir ) {
            if (file_exists($dir.'class.'.strtolower($class_name).'.php')) {
                require_once($dir.'class.'.strtolower($class_name).'.php');
                return;
            }
        }
    });

上記では、PHP __autoload と spl_autoload を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。