Добро пожаловать в удивительный мир видимости переменных PHP.
Функции и методы не видят никаких переменных, определенных вне их. Вы должны использовать ключевое слово global
, чтобы объявить, что вам нужен доступ к переменным, определенным вне области действия функции.
Это не сработает:
class Foo {
public function bar() {
echo $baz;
}
}
$f = new Foo();
$baz = 'Hello world!';
$f->bar(); // "Notice: Undefined variable: ..."
Это будет работать:
class Foo2 {
public function bar() {
global $baz; // <- "I want $baz from the global scope"
echo $baz;
}
}
$f = new Foo2();
$baz = 'Hello world!';
$f->bar(); // "Hello world!"
Даже если это работает, вам следует избегать его использования. Есть лучшие способы прохождения во внешнем объекте. Один из способов называется « внедрение зависимостей », что является причудливым способом сказать «передать внешние зависимости во время построения». Например:
class Index extends Application {
private $smarty;
public function __construct(Smarty $smarty) {
$this->smarty = $smarty;
}
public function showPage() {
$smarty->assign('foo', 'bar');
$smarty->display('index.tpl');
}
}
$sm = new Smarty(...);
$whatever = new Index($sm);
$whatever->showPage();
Другим способом является использование реестра, который представляет собой шаблон, используемый для хранения вещей, которые в противном случае могли бы быть глобальными переменными. Давайте попробуем Zend Registry в качестве примера.
class Index extends Application {
public function showPage() {
$smarty = Zend_Registry::get('smarty');
$smarty->assign('foo', 'bar');
$smarty->display('index.tpl');
}
}
$sm = new Smarty(...);
Zend_Registry::set('smarty', $sm);
$whatever = new Index();
$whatever->showPage();