PHP调用类变量/属性与存储闭包

时间:2018-03-16 23:05:09

标签: php oop magento closures anonymous-function

所以我用PHP制作Magento模块。我希望我的日志记录在所有类中保持一致。我的想法是在helper类中定义一个方法并调用它。然而,作为我的预优化器,我想通过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();

时正在寻找方法调用

我确实理解A)我可以把它搞砸并在任何地方使用Mage::Helper,并且B)我可以将助手对象存储在变量中并调用$this->helper->log()和C)静态变量有效,请参阅PHP closure as static class variable

那么,有没有办法让非静态类变量调用闭包而不是寻找不存在的方法?

1 个答案:

答案 0 :(得分: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');