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

时间:2013-12-07 13:39:42

标签: php function routing 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();
  

这里我使用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类传递给函数?

... THX

1 个答案:

答案 0 :(得分:14)

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

无论如何,为方便起见,在路由时,此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'];
};

这三个功能完全相同,所以你应该选择一个你最了解的功能。但是你应该记住$f3$params只在路由时传递 ,这意味着3个函数:路由处理程序,beforeRoute()钩子和afterRoute()钩。在代码中的任何其他位置(包括类构造函数内),您应该调用Base::instance()来检索F3实例。

PS:你的问题是“为什么我必须将$ f3类传递给函数?”,我建议你重命名它的标题以反映它。

UPDATE:从版本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
    }
}