【发布时间】:2018-08-26 02:31:02
【问题描述】:
所以我正在 PHP 中制作一个 Magento 模块。我希望我的日志记录在所有类中保持一致。我的想法是在帮助类中定义一个方法并调用它。然而,作为我的预优化器,我认为通过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
那么,有没有办法让非静态类变量调用闭包,而不是寻找不存在的方法?
【问题讨论】:
-
所以我不熟悉 Magento,所以我的问题可能很愚蠢,但是为什么要在
Comp_Mod_Helper_Data方法中返回一个闭包,而不是使用一个简单的log方法来调用Mage::log?然后你会做$helper = Mage::Helper('mod'); $helper->log(...)(也可以将助手实例存储在控制器属性中) -
@Jeto,感谢您的评论。我确实意识到我可以做到这一点。我在倒数第二段中提到有可接受的解决方法。我的问题更多是关于语言及其工作原理,而不是它的设计。
-
我确实错过了该段的 B) 部分,对此感到抱歉。如果到那时没有人帮助你,我会在今天晚些时候再读/思考一下。
标签: php oop magento closures anonymous-function