Fat-Free-Framework全局变量和函数

Liz*_*Liz 7 php routing function global-variables fat-free-framework

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

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

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

$f3->run();
Run Code Online (Sandbox Code Playgroud)

这里我使用GET/@页面作为url路由的标记.在函数i中,然后使用$ 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();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么我必须将$ f3类传递给函数?

谢谢...

xfr*_*a35 15

$f3=require...可以使用静态调用在代码中的任何位置检索在index.php()的最开始声明的F3实例变量$f3=Base::instance().

无论如何,为了方便起见,在路由时,这个F3实例以及路由参数被传递给路由处理程序.因此,不要将路由处理程序定义为:

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

你可以把它定义为:

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

甚至更好:

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

这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
    }
}
Run Code Online (Sandbox Code Playgroud)