12

例:

ClassName.php

<?php echo "This will crash all"; ?>

別のファイルで...

foreach ($FILENAMES_WITHOUT_DOT_PHP as $name => $value) {
    if (class_exists( $value )) {
      echo "ClassName exists...";
    }
    else {
      echo "ClassName doesn't exists....";
    }
}

このコードの出力は次のとおりです

これの代わりに: ClassName does not exist....

オートロード機能:

function __autoload( $var_class )
{
     require_once( "$var_class.php") ;
}
4

4 に答える 4

12

さて、これが内部でどのように機能するかです。

存在しないクラスを使用しようとすると、そのクラスが存在する (関数がそれらの 1 つになる)spl_autoloadまで、コールバックが 1 つずつ呼び出されます。__autoloadチェーンの最後に存在しない場合は、class not found エラーが発生します。

class_exists2 番目のパラメータ (存在しない場合はロードしないように指示する) なしで呼び出すと、クラスが見つかるか、最後のメソッドが呼び出されるまで、一連のコールspl_autoloadバックが呼び出されます。次に、クラスが見つかった場合に戻ります。

したがって、それはすべて、オートロード機能で何をしているかに依存します。次のようなことをすると:

function __autoload($class) {
    $filename = PATH_TO_CLASSES . $class . '.php';
    if (!file_exists($class)) {
        die('Could not find '.$class);
    }
    require_once $filename;
}

実行を強制終了し、意図したとおりに機能しません。代わりに、次のことを行う必要があります。

function __autoload($class) {
    $filename = PATH_TO_CLASSES . $class . '.php';
    if (file_exists($class)) {
        require_once $filename;
    }
}

それはあなたがする必要があるすべてです。

ここで、ファイルを実行したくありません。それはいいです。それには簡単な解決策があります。そのファイルを自動ロードされたクラスと同じディレクトリに入れないでください。オートローディングの目的を無効にします。

他の唯一の解決策は、クラス名のマップをファイル名に保存し、それをオートロードのベースにすることです。そうしないと、常にファイルが実行されます(それがあなたが求めていることだからです)...

于 2010-09-28T13:42:58.397 に答える
12

class_exists を使用すると、デフォルトでオートローダーがヒットするため、問題が発生しています。2 番目のパラメーターを false に設定することで、登録済みのオートローダーをバイパスできます。

class_exists('foo', false)

PHPドキュメントから

于 2013-01-11T00:28:16.747 に答える
1

autoload 関数内で class_exists を使用してから、二度と使用しないでください。それがオートローダーのポイントです。

class App {
    static private $_instance = NULL;

    public function __construct() {
        spl_autoload_register('app::autoLoader');
    }

    public function __destruct() {
    }

    public static function getInstance() {
        if(self::$_instance == NULL) {
            self::$_instance = new App();
        }
        return self::$_instance;
    }

    public static function autoLoader($class) {
        $className = stripslashes($class);
        if (class_exists($className)) {
            return;
        }
        require $className.'.class.php';
    }
}
于 2010-09-28T13:03:16.003 に答える
0

何が起こるかは非常に論理的です。あなたの __autoload 関数はおそらく ClassName.php をインクルードしているだけなので、そこにある echo ステートメントを実行します。

ファイルにクラス定義があるかどうかを判断しようとしている場合は、( file_get_contentsまたは同様の関数を使用して) ファイルの内容を読み取り、正規表現またはtoken_get_allを使用してこれらの内容をスキャンしてクラス定義を見つけることができます( PHP クラス ファイルで定義されているクラスの決定)。

于 2010-09-28T13:29:21.207 に答える