1

PHP でオートローディングがどのように機能するかについて、まだいくつかの誤解があるようです。

メイン関数内にあるというクラスがglueあり、ここでは次のように呼び出されます。spl_autoload_registerrun

class glue{
    public static function run(){
        spl_autoload_register(array('glue','autoload'));
    }
}

オートロード機能は、PSR-0 標準を介してロードすることで機能し、絶対パスから機能します。これはすべて、動作などとしてテストされてglueいます。名前空間が付けられていないことに注意してください。

オートロード機能は、 という名前空間をカバーしていますglue。このネームスペース内に、 というエラー ハンドラがあります\glue\ErrorHandler

エラーをトリガーすると、格納された定数で定義されているように、glueクラスは\glue\ErrorHandlerルート ディレクトリから PSR-0 表記で自動ロードされます。これは、やROOTなどのクラスでも機能することがテストされています。\glue\User\glue\Session

それでは、問題です。Call-time pass-by-reference has been deprecated内部でエラーが発生し、\glue\Validationオートロード機能が実行されていないようです。

すべてのオートロード関数にどのように入っているかを見ることができますが、そのクラスでこのエラーを呼び出すと、オートローダーをスキップして、エラーハンドラークラスが見つからないと言って救済するようです。

通常、それは私のプログラミングの問題だと思いますが、私はすべてを試しました。この1つのエラーについて、その方法を説明することはできません。私の混乱をさらに悪化させるのは、次のことを引き起こした場合です。

syntax error, unexpected T_ISSET in /media/server_ws/xxxxxxx/glue/Validation.php on line 47

エラーで動作します。その1つのエラーのためのようで、エラーハンドラーを自動ロードしません。

これは、 myspl_autoload_registerがその名前空間にバインドされていないため (動作するエラー ハンドラーが実際には 内から呼び出されるためglue)、おそらくランダムに動作しているためだと思いました。だから\glue\Validation私は一度も見たことのないクラスを呼び出しました\glue\util\Cryptが、それは機能し、オートローダーに正しく入ります。

このエラーを呼び出すと、クラスCall-time pass-by-reference has been deprecated内からglue完全に機能します。

誰でもこれに光を当てることができますか?

編集

ここで要求されているのは、の簡略版ですValidation.php

namespace glue;

use glue,
    \glue\Exception,
    \glue\Collection;

class Validation extends \glue\Component{
    private function validateRule($rule){
        // This is the line, notice the pass by reference down there?
        $valid = $validator($field,$field_value,$params,&$this->model) && $valid;
    }
}
4

1 に答える 1

0

スクリプトのCall-time pass-by-reference has been deprecatedコンパイル中にエラーがスローされ、コンパイル中に自動読み込みが無効になります。コンパイラは複数のスクリプトのコンパイルを同時に開始できない (つまり、再入可能ではない) ため、無効になっています。

ソース: https://github.com/php/php-src/blob/76ad52ccc501c02aeb068d2eb4f119ef6f0c2b6a/Zend/zend_execute_API.c#L1058

于 2013-05-24T11:29:21.900 に答える