这可能是基本的东西,但我没有经过培训的开发人员,所以请耐心等待。
我的问题是:如何在php“global”中获取一个类,以便我可以在函数调用之外初始化它,但仍然在内部使用它?
这个例子显示了我想要实现的目标,但显然不起作用:
$view = new Smarty();
$view->debugging = false;
$view->caching = false;
$view->cache_lifetime = 1;
$view->setTemplateDir('../views/');
$app->get('/register', function (Request $request, Response $response) {
$param = $request->getParams();
$view->assign('name', $param["name"]);
$response = $view->display('index.html');
return $response;
});
要让它工作,我必须在$ app-> get调用中定义它。当然,$ view->调试等也必须在$ app-> get调用中设置。
这样做的目的是避免为每次调用初始化$ view的新实例,并使默认设置为全局。
编辑: 也许我在这里快速提出这个问题。谷歌搜索后,我想我可能会找到解决方案。但是在函数内使用“global $ view”我可以访问类的实例。这与你设置“public $ variable = new class.function()”的其他语言不同,但可能有这样的原因,我可以肯定地看到它如何成为安全/性能的优势等等。还有其他办法吗?什么是赞成/缺点?
答案 0 :(得分:2)
使用全局变量不被视为良好做法;它使代码很难测试。请参阅Why is Global State so Evil?您通常希望进行依赖注入:
function doSomething($obj)
{
// code here
}
$foo = new MyClass();
doSomething($foo);
当然,当您使用可能存在意见的框架时,这可能会非常棘手。
在您的情况下,更好的解决方案是使用the use
keyword从本地范围而不是全局范围继承变量,如:
$app->get('/register', function (Request $request, Response $response) use ($view) {
$param = $request->getParams();
$view->assign('name', $param["name"]);
$response = $view->display('index.html');
return $response;
});
如果必须使用全局,只需使用global关键字:
$app->get('/register', function (Request $request, Response $response) {
global $view;
$param = $request->getParams();
$view->assign('name', $param["name"]);
$response = $view->display('index.html');
return $response;
});
答案 1 :(得分:0)
在这种特定情况下,您将使用闭包,如下所示:
$app->get('/register', function (Request $request, Response $response)
use ($view) {
// ... code ... $view is defined here
}
您也可以通过引用调用use(即use (&$view)
)以便能够修改闭包范围中的变量。
请参阅PHP手册中的文档:http://php.net/manual/en/functions.anonymous.php。