7

我是无脂肪框架的新手,我对全局变量有点困惑。

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

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

$f3->run();

在这里,我使用 GET /@page 作为 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 类传递给函数?

谢谢...

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 个功能完全相同,因此您应该选择您最了解的一个。但是你应该记住,$f3and$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
    }
}
于 2013-12-09T08:21:35.110 回答