class 在 php 中的全局实例

Global instance of class in php

这可能是基本内容,但我不是受过训练的开发人员,所以请多多包涵。

我的问题是:如何在 php "global" 中得到一个 class 以便我可以在函数调用之外初始化它,但仍然在内部使用它?

此示例显示了我想要实现的目标,但显然不起作用:

$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->debugging 等也必须在 $app->get 调用中设置。

这样做的目的是避免每次调用都必须初始化一个新的 $view 实例,并将默认设置设为全局。

编辑: 也许我是想在这里快速问这个问题。经过 google 搜索后,我想我可能找到了解决方案。但是在函数内部使用 "global $view" 我可以访问 class 的实例。这与您设置 "public $variable = new class.function()" 的其他语言不同,但可能是有原因的,我可以肯定地看到这对 security/performance 等有什么好处。有没有其他方法? pro/cons 是什么?

在这种特定情况下,您将使用闭包,如下所示:

$app->get('/register', function (Request $request, Response $response) 
    use ($view) { 
  // ... code ... $view is defined here
}

您也可以调用 use by reference(即 use (&$view))以能够修改闭包作用域中的变量。

请参阅 PHP 手册中的文档:http://php.net/manual/en/functions.anonymous.php

使用全局变量不是好的做法;它使得代码很难测试。见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;
});