3

__autoload 関数を使用するようにいくつかの php スクリプトを変換しようとしています。現在、次のように include および require 関数を使用できます。

require_once('path/to/script.php');

しかし、__autoload 関数内では、上記の行を使用できません。私はこれを使用する必要があります:

require_once('absolute/path/to/script.php');

__autoload 関数が、php.ini で指定したインクルード パスを使用していないように見えるのはなぜですか?

4

4 に答える 4

10

使用しないでください__autoload... いくつかの欠点があります (実行ごとに 1 つに制限するなど)。spl_autoload_register5.2+ を使用している場合は、代わりに使用してください。

したがって、私が通常行うことは、クラスを作成することです。

class AutoLoader {
    protected static $paths = array(
        PATH_TO_LIBRARIES,
    );
    public static function addPath($path) {
        $path = realpath($path);
        if ($path) {
            self::$paths[] = $path;
        }
    }
    public static function load($class) {
        $classPath = $class; // Do whatever logic here
        foreach (self::$paths as $path) {
            if (is_file($path . $classPath)) {
                require_once $path . $classPath;
                return;
            }
        }
    }
}
spl_autoload_register(array('AutoLoader', 'load'));

そうすれば、ライブラリ セットを追加する場合は、 を呼び出すだけでパスに「追加」できますAutoLoader::AddPath($path);。これにより、オートローダーでのテストが非常に簡単になります(IMHO)。

もう1つのメモ。どうしても必要な場合を除き、autoload クラスから例外をスローしないでください。その理由は、複数のオートローダーをインストールできるため、ファイルのロード方法がわからない場合は、それをロードする別のオートローダーが存在する可能性があるためです。ただし、例外をスローすると、他の例外がスキップされます...

個人的には、インクルードで相対パスを使用するのは好きではありません。特に (pear のように) 複数のインクルード ディレクトリがある場合、require 'foo/bar.php';. 私は、ファイル セットの先頭に絶対パスを定義define('PATH_ROOT', dirname(__FILE__));し、そのディレクトリ以外のすべての有用なパス ( PATH_LIBRARIESPATH_TEMPLATESなど) を定義することを好みます。そうすれば、すべてが完全に定義されます...そして、相対パスに対処する必要はありません(現在抱えている問題のように)...

于 2010-07-21T14:11:14.590 に答える
0

.インクルードパスにないようです。したがって、次を使用して追加します。

set_include_path('.' . PATH_SEPARATOR . get_include_path());

これで、PHP も、実行されたスクリプト ディレクトリに対して相対的に見えるはずです。(ここで実行されるスクリプトはindex.php、 ではなくのようなものautoload.phpです。

しかし、単に通常の相対パスを使用しないのはなぜ./path/to/class.phpですか?

于 2010-07-21T14:33:56.167 に答える
0

あなたの__autoload()関数は、それを呼び出すコードとは別のファイルにあると思われます。__autoload()インクルードされたファイルへのパスは、関数宣言が存在するファイルに対して相対的になります。

于 2010-07-21T13:43:08.057 に答える
0

セットアップ全体を見ないとわかりません。自動ロード関数はグローバル関数ファイル内にあり、次のようになります。

function __autoload($class) {
    if (file_exists("includes/{$class}.php")) {
        require_once("includes/{$class}.php");
    }
    /**
     * Add any additional directories to search in within an else if statement here
     */
    else {
        // handle error gracefully
    }
}

index.phpスクリプトがファイルに含まれており、すべての HTTP 要求がそれを介して渡されるため、相対パスを使用します。

于 2010-07-21T13:40:13.010 に答える