php

时间:2016-12-14 20:47:57

标签: php class smarty new-operator slim

这可能是基本的东西,但我没有经过培训的开发人员,所以请耐心等待。

我的问题是:如何在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()”的其他语言不同,但可能有这样的原因,我可以肯定地看到它如何成为安全/性能的优势等等。还有其他办法吗?什么是赞成/缺点?

2 个答案:

答案 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