Magento:每次循环运行时都要创建一个辅助类的新实例?

时间:2012-10-26 14:36:15

标签: php magento

我创建了一个自定义助手类模块,我正在这样调用:

$bench = Mage::helper('benchmark');
// ... do stuff ...
$bench->addBenchmark();
// ... more stuff ...
$bench->logResults();

这将输出数组中时间基准的结果。

该类非常简单,它基本上只是将当前microtime()添加到数组中,然后在调用logResults()时将该数组吐出。

问题是,我有一个循环,我在上面调用上面的代码,而不是记录"新鲜"每个循环的基准数据集,它自己复合并添加到现有的基准数组!

我希望每次调用Mage::helper('benchmark');时都创建一组新的基准。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

使用无法执行的帮助程序,除非您在调用addBenchmark方法时手动刷新数组的内容。

问题在于以下内容。在Mage.php内,您请求的帮助程序存储在注册表中。在下次调用时,将从注册表中检索完全相同的帮助程序对象,而不是新的。它只在第一次调用帮助程序时创建一个实例。

/**
 * Retrieve helper object
 *
 * @param string $name the helper name
 * @return Mage_Core_Helper_Abstract
 */
public static function helper($name)
{
    if (strpos($name, '/') === false) {
        $name .= '/data';
    }

    $registryKey = '_helper/' . $name;
    if (!self::registry($registryKey)) {
        $helperClass = self::getConfig()->getHelperClassName($name);
        self::register($registryKey, new $helperClass);
    }
    return self::registry($registryKey);
}

您可以选择模型,因为getModel()每次调用工厂方法时都会返回一个新实例。虽然在我看来这是一个糟糕的编程案例,但也会影响你的表现。

我会在拨打addBenchmark的新电话时选择刷新最新数据。如果要将所有数据存储在帮助程序中以供以后处理,或许总是返回数组中的最新密钥?虽然这是一个选择和味道的问题,所以我会把那部分留给你。

希望这会对你有所帮助!

答案 1 :(得分:2)

添加基准键并制作类似

的内容
$this->benchmarks[$key]['start'] = microtime(true);
// ... 
$this->benchmarks[$key]['finish'] = microtime(true);

所以你将为每次迭代都有一系列的开始 - 结束对

为什么不想使用Varien_Profiler?

Varien_Profiler::start($_profilerKey);
// ...
Varien_Profiler::stop($_profilerKey);