2016-12-14 9 views
0

Это, вероятно, базовый материал, но я не обученный разработчик так не медлят со мной.Глобальный экземпляр класса в php

Мой вопрос: Как я могу получить класс в 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-> получить колл. Затем, конечно, в $ app-> get call необходимо установить $ view-> debugging и т. Д.

Целью этого является отсутствие необходимости инициализировать новый экземпляр $ view для каждого вызова и получить настройки по умолчанию для глобальных.

Редактировать: Возможно, я должен был быстро задать вопрос здесь. После поиска в Google я думаю, что могу найти решение. Но используя «global $ view» внутри функции, я получаю доступ к экземпляру класса. Это отличается от других языков, на которых вы устанавливаете «public $ variable = new class.function()», но, вероятно, причина в том, что это так, и я могу определенно увидеть, как это может быть преимуществом для безопасности/производительности и т. Д. есть альтернативный способ? Что такое pro/cons?

ответ

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

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

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