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;
});
这可能是基本内容,但我不是受过训练的开发人员,所以请多多包涵。
我的问题是:如何在 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;
});