0

Zend が存在しないファイルを自動ロードしようとすると、try/catch ブロックでキャッチできないエラーがスローされることがわかりました。これは私も使用すると起こりclass_existsます。zendをハッキングして問題を修正しました:

if ($once) {
    if (!@include_once ($filename)) {
        throw new Exception("Failed to include $filename");
    }
    // include_once $filename;
}
else {
    if (!@include ($filename)) {
        throw new Exception("Failed to include $filename");
    }
    // include $filename;
}

コメントアウトされた行は zend のオリジナルです。ファイルをインクルードできない場合にスローされる例外をキャッチできるようになりました。zendのハッキングを伴わない、これを行うためのよりクリーンな方法を提案できる人はいますか?

私は Zend バージョン 1.11.10 を使用しており、問題のコードは Zend_Loader の 146 行目です。

ありがとう。

4

2 に答える 2

1

include または include_once を使用する代わりに、使用してみてくださいZend_Loader::loadClass()

API は次のとおりです。Zend_Loader::loadClass($class, $dirs)

例:

Zend_Loader::loadClass('Container_Tree',
    array(
        '/home/production/mylib',
        '/home/production/myapp'
    )
);

それがどのように機能するかについての宣伝文句:

クラスを指定する文字列は、アンダースコアを OS のディレクトリ区切り記号に置き換え、'.php'を追加することにより、相対パスに変換されます。上記の例では、*'Container_Tree'* は Windows では'Container\Tree.php'になります。

$dirsが文字列または配列の場合、*Zend_Loader::loadClass()* は指定された順序でディレクトリを検索します。最初に一致したファイルがロードされます。指定した$dirsにファイルが存在しない場合は、PHP 環境の include_path が検索されます。

ファイルが見つからないか、ロード後にクラスが存在しない場合、 *Zend_Loader::loadClass()* はZend_Exceptionをスローします。

これにより、存在しないクラスに対して try/catch ブロックを使用できるようになります。Zend_Loader::loadFile() にも同様の機能があります。

于 2012-07-01T06:35:37.943 に答える
0

存在しないクラスをオートロードしようとしないでください。なんらかの理由でオートロードしようとしているクラスがそこにある場合とない場合がある場合は、コードのその部分をclass_exists()呼び出しでラップします。

class_exists()クラスの存在を確認できるようにすることが唯一の目的であるため、失敗時に例外をスローする理由は考えられません。

于 2012-06-30T09:23:08.280 に答える