Глобальный экземпляр класса в переполнении стека

Это, вероятно, базовые вещи, но я не обученный разработчик, так что терпите меня.

Мой вопрос: как я могу получить класс в 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 ()», но, вероятно, есть причина для этого, и я определенно могу видеть, как это может быть преимуществом для безопасности / производительности и т. Д. Есть ли альтернативный способ? Какие плюсы / минусы?

0

Решение

Использование глобальных переменных не считается хорошей практикой; это делает код очень сложным для тестирования. Увидеть Почему Глобальное Государство так Зло? Вы обычно хотите сделать внедрение зависимости:

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;
});
2

Другие решения

В этом конкретном случае вы бы использовали замыкание, например так:

$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.

0

По вопросам рекламы [email protected]