【问题标题】:PHP call class variable / property with stored closurePHP调用具有存储闭包的类变量/属性
【发布时间】: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


【解决方案1】:

你可以使用__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');

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多