oop — переменная / свойство класса вызова PHP с сохраненным закрытием

Поэтому я делаю модуль Magento на PHP. Я хочу, чтобы моя регистрация была последовательной для всех классов. Моя идея состояла в том, чтобы определить метод в классе помощника и вызвать его. Тем не менее, будучи предварительным оптимизатором, я полагаю, что несколько раз обращаюсь к классу через Mage::Helper() метод должен быть более дорогим, чем нужно, тем более что большая часть моей регистрации в одиночных моделях так или иначе. Теперь моя идея состоит в том, чтобы использовать замыкания, определить мой метод в помощнике, сделать один вызов помощнику и зарегистрировать метод в переменной класса.

class Comp_Mod_Helper_Data extends Mage_Core_Helper_Abstract {
public function getLogger() {
return function ($obj, $type= Zend_Log::DEBUG) {
Mage::log($obj, $logType, 'comp-mod.log', true);
};
}
}

Использование:

class Comp_Mod__IndexController extends age_Core_Controller_Front_Action {
private $_log;
protected function _construct() {
$this->_log = Mage::Helper('mod')->getLogger();
}
}

Однако, пока это работает … это не здорово использовать. Я либо застрял, делая:

$log = $this->_log;
$log('hello world');
// one awkward liner
($this->_log)('hello world');

Несмотря на то, что он работает, он не читается и не является стандартным, то есть сбивает с толку! Ошибка, которую он получает при использовании $this->_log('hello world'); является то, что метод не существует. Я предполагаю, потому что PHP ищет вызов метода при использовании синтаксиса $this->method();

Я понимаю, что А) Я мог бы просто смириться с этим и использовать Mage::Helper везде, и Б) чтобы я мог хранить вспомогательный объект в переменной и вызывать как $this->helper->log()и C) что статические переменные работают, см. Закрытие PHP как статическая переменная класса

Итак, есть ли способ получить нестатическую переменную класса для вызова замыкания вместо поиска несуществующего метода?

0

Решение

Вы могли бы использовать __call магический метод:

class Comp_Mod__IndexController extends age_Core_Controller_Front_Action {

public function __call($method, array $args)
{
switch ($method)
{
case '_log':
return call_user_func_array(Mage::Helper('mod')->getLogger(), $args);
}

return null;
}
}

Затем используйте его так, как вы хотели:

$this->_log('string to log');
0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector