Fat-Free-Framework глобальные переменные и функции

Я новичок в фреймворке без жира, и я немного запутался в глобальных переменных.

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

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

$f3->run();

Здесь я использую GET /@ страницу в качестве токена для URL-маршрута. Затем в функции я использую $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 в функцию?

Спасибо...

1 ответ

Решение

Переменная экземпляра F3, которая объявлена ​​в самом начале вашего index.php ($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 передаются только во время маршрутизации, что означает 3 функции: обработчик маршрута, хук beforeRoute() и хук afterRoute(). В любом месте кода (в том числе внутри конструктора класса) вы должны вызывать Base::instance() чтобы получить экземпляр F3.

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
    }
}
Другие вопросы по тегам