7

私は脂肪のないフレームワークが初めてで、グローバル変数について少し混乱しています。

$f3->route('GET /@page','display');

    function display($f3) {
        echo 'I cannot object to an object' . $f3->get('PARAMS.page');
    };

$f3->run();

ここでは、URL ルートのトークンとして GET /@page を使用しています。関数では、 $f3->get('PARAMS.page') を使用してその変数の値を取得します。

$f3->get はグローバル変数を取得するメソッドなので、なぜ関数に $f3 クラスを渡す必要があるのでしょうか。

以下のコードは機能しません ($f3 クラスが関数に渡されません)。

$f3->route('GET /@page','display');

    function display() {
        echo 'I cannot object to an object' . $f3->get('PARAMS.page');
    };

$f3->run();

だから私の質問は: なぜ $f3 クラスを関数に渡す必要があるのですか?

どうも...

4

1 に答える 1

15

index.php() の最初で宣言されている F3 インスタンス変数は$f3=require...、静的呼び出しを使用してコード内のどこからでも取得できます$f3=Base::instance()

とにかく、便宜上、ルーティング時にこの F3 インスタンスとルート パラメータがルート ハンドラに渡されます。したがって、ルート ハンドラを次のように定義する代わりに、

function display() {
    $f3=Base::instance();
    echo 'I cannot object to an object' . $f3->get('PARAMS.page');
};

次のように定義できます。

function display($f3) {
    echo 'I cannot object to an object' . $f3->get('PARAMS.page');
};

またはさらに良い:

function display($f3,$params) {
    echo 'I cannot object to an object' . $params['page'];
};

これら 3 つの機能は完全に同一であるため、最もよく理解している機能を選択する必要があります。$f3ただし、とはルーティング時$paramsにのみ渡されることを覚えておく必要があります。つまり、ルート ハンドラ、beforeRoute() フック、afterRoute() フックの 3 つの関数に渡されます。コード内の他の場所 (クラス コンストラクター内を含む) では、呼び出して F3 インスタンスを取得する必要があります。Base::instance()

PS: 「なぜ $f3 クラスを関数に渡さなければならないのですか?」というご質問は、それを反映するようにタイトルの名前を変更することをお勧めします。

更新:リリース 3.2.1 以降、F3 インスタンスもルート ハンドラー クラスのコンストラクターに渡されます。

class myClass {
    function display($f3,$params) {
        echo 'I cannot object to an object' . $params['page'];
    }
    function __construct($f3) {
        //do something with $f3
    }
}
于 2013-12-09T08:21:35.110 に答える