2

私が使用しているオートロード機能は次のとおりです。

function __autoload($moduleName) 
{
     //Logic to check file existence- include if exists else redirect to fallback page
}

他の引数を取らないのですか?autoload 関数内のいくつかの変数に基づいて、いくつかのロジックを実行したいと考えています。グローバル変数を使わずにそれを行うにはどうすればよいですか?

ありがとう

追加の詳細

これは __autoload() クラス内では不可能だと思いますが、例で説明しようとしています。

私は配列を持つmodules.configファイルを持っています:-

$viewClassMap =  array('search_classes' => 'commonClassListings',
                       'search_packs' => 'commonPackListings',
                       );

上記の配列は、search_classes ビューの場合はクラス commonClassListings を含める必要があり、search_packs ビューの場合はクラス commonPackListings を含める必要があることを意味します。他のすべてのビューでは、デフォルトで commonDisplay クラスが含まれます

function __autoload($viewName,$viewClassMap) 
{
    if(in_array($viewName,$viewClassMap))
    {
       $viewTobeIncluded = $viewClassMap[$viewName];

       include path/to/$viewTobeIncluded;   
    }
    else
    {
       include path/to/commonDisplay;   
    }
}

ここで、__autoload 関数内のロジックを移動する必要があり、最初にロードするビューを計算してから、オートロードのみを呼び出す必要があると思います。これは、オートロードの目的でもあります (オブジェクトが開始されたクラス ファイルを含めるため)。

アップデート

私の autoload 関数は、実行時にオブジェクトを開始しようとしているビュー クラス内にありません (Blizz の例とは異なります)。一般的なフロントコントローラーに含まれる pageLoader.php ファイルで定義された一般的なオートロード関数があります。すべてのモジュールについて、ビュークラスは次のように開始されます

$view  = new search_classes();

次に、共通の autoload 関数は、対応する親ビュー クラス (この場合は commonClassListings) が存在するかどうかをチェックする必要があります。このために、$viewClassMap配列を autoload 関数に渡す必要があります。それは可能ですか?

4

3 に答える 3

4

私が考えることができる唯一の方法は、クラス オブジェクトを autoload ハンドラとして登録することです (spl_autoload_register を使用)。array($oInstance, "functionName") をコールバックとして指定することで、いつでもインスタンスを登録できます。

自動ロードをトリガーする操作を実行する前に、そのクラス インスタンスに変数を設定できます。

編集:あなたの要求に従って、これがどのように機能するかについての小さな例。私は通常、オートロードのクラスで静的メソッドを使用するため、インスタンスで機能するかどうかはわかりませんが、ドキュメントを確認したところ、機能するはずです。機能しない場合は、関数と配列を静的にすることができます

class Test
{
    public $viewClassMap =  array('search_classes' => 'commonClassListings',
                       'search_packs' => 'commonPackListings',
                       );

   public function autoload($viewName)
   {
    if (in_array($viewName,$this->viewClassMap))
            ...
    }
}

$test = new Test;
spl_autoload_register(array($test, 'autoload'));
于 2010-08-04T06:14:17.410 に答える
0

アイデアは、定数を使用することです。少なくとも私の問題を解決するために働いた。

もちろん、定数はファイルごとに 1 回だけ定義できます。また、次のコードを状況に合わせて (つまり$dir$viewClassMap) 適合させる必要があります。

それが、オートロードに別の「パラメーター」を渡す方法です。

define('DIR',$dir);

function foo_autoload($class){
    $packages=array('pack','pack2');

    foreach($packages as $v){
        if(file_exists(DIR.$v.'/'.$class.'.php')==true){
            require(DIR.$v.'/'.$class.'.php');
            break;
        }
    }
}
spl_autoload_register('foo_autoload');

変数を使用して定数を定義する意味がないように思われる場合は、その変数がメソッドのパラメーターに由来する場合はそうします。私の場合、そのコードはすべて別のメソッド内にあります。

于 2014-01-23T13:33:49.510 に答える
0

__autoload 関数を呼び出さないため、パラメータを渡しても意味がありません。何らかの状態を保存したい場合は、静的変数を使用できます (たとえば、ロードされたすべてのクラス/タイミングなどを追跡します)。

やりたいロジックについて詳しく教えてください。もっと良い方法があるかもしれません。

于 2010-08-04T09:59:41.347 に答える