У вас довольно много проблем в коде, который вы разместили:
- Аномальные функции
В PHP
вы не можетесоздать new function()
, чтобы определить анонимную функцию, вы просто используете этот синтаксис
$foo = function() {
return 'foo';
}
echo $foo(); //output: foo
Передача переменных в анонимную функцию
Внутри вашей функции $detectMobile
вы пытаетесь получить доступ к переменной $detect
, однако эта переменная не определена в scope анонимной функции.
Чтобы правильно использовать $detect
внутри вашей функции, вам нужно использовать языковую конструкцию use
.
$detectFunction = new function() use($detect) {
if ($detect->isMobile()) return true;
else return false;
}
Вы также можете использовать языковую конструкцию global
, но это не рекомендуется
$detectFunction = new function() {
global $detect;
if ($detect->isMobile()) return true;
else return false;
}
Передача анонимной функции
Не использовать кавычки для передачи переменных экземпляров.
Использование new Twig_SimpleFunction('detectDevice', '$detectFunction')
twig
скажет запустить глобальную функцию $detectFunction
Использование new Twig_SimpleFunction('detectDevice', "$detectFunction")
попытается преобразовать анонимную функцию в строку.Что невозможно
Единственный правильный способ передать анонимную функцию - просто передать ссылку:
new Twig_SimpleFunction('detectDevice', $detectFunction)
Теперь, если выобъединить все, что вы могли бы сделать что-то вроде этого
class Project_Twig_Extensions extends Twig_Extension{
public function getFunctions() {
$detect = new Mobile_Detect();
return array(new Twig_SimpleFunction('detectDevice', function() use($detect) {
if ($detect->isMobile()) return true;
else return false;
}));
}
}
или даже лучше
class Project_Twig_Extensions extends Twig_Extension{
protected $detect = null
protected function getDetector() {
if ($this->detect === null) $this->detect = new \Mobile_Detect();
return $this->detect;
}
public function getFunctions() {
return array(new Twig_SimpleFunction('detectDevice', function() {
return $this->getDetector()->isMobile();
}));
}
}
На потерянной заметке, пожалуйста, убедитесь, что покажет все ошибки в то время каквы развиваетесь ..