Это, вероятно, базовые вещи, но я не обученный разработчик, так что терпите меня.
Мой вопрос: как я могу получить класс в 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-> debugging и т. Д. Также должны быть установлены внутри вызова $ app-> get.
Цель этого состоит в том, чтобы избежать необходимости инициализировать новый экземпляр $ view для каждого вызова и получить глобальные настройки по умолчанию.
Редактировать:
Может быть, я должен был быстро задать вопрос здесь. После поиска в Google, я думаю, я мог бы найти решение. Но используя «глобальное представление $» внутри функции, я получаю доступ к экземпляру класса. Это отличается от других языков, где вы устанавливаете «public $ variable = new class.function ()», но, вероятно, есть причина для этого, и я определенно могу видеть, как это может быть преимуществом для безопасности / производительности и т. Д. Есть ли альтернативный способ? Какие плюсы / минусы?
Использование глобальных переменных не считается хорошей практикой; это делает код очень сложным для тестирования. Увидеть Почему Глобальное Государство так Зло? Вы обычно хотите сделать внедрение зависимости:
function doSomething($obj)
{
// code here
}
$foo = new MyClass();
doSomething($foo);
Конечно, это может быть сложно, когда вы работаете с потенциально самоуверенным фреймворком.
Лучшим решением в вашем случае является использование use
ключевое слово наследовать переменную из локальной области вместо глобальной области, как в:
$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;
});
если ты должен использовать глобальный, просто используйте Глобальный ключевое слово:
$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;
});
В этом конкретном случае вы бы использовали замыкание, например так:
$app->get('/register', function (Request $request, Response $response)
use ($view) {
// ... code ... $view is defined here
}
Вы также можете назвать использование по ссылке (т.е. use (&$view)
) чтобы иметь возможность изменять переменную в области закрытия.
Смотрите документацию в руководстве по PHP: http://php.net/manual/en/functions.anonymous.php.