Php Magento:每次循环运行时都创建助手类的新实例?

Php Magento:每次循环运行时都创建助手类的新实例?,php,magento,Php,Magento,我创建了一个自定义帮助器类模块,我将其称为: $bench = Mage::helper('benchmark'); // ... do stuff ... $bench->addBenchmark(); // ... more stuff ... $bench->logResults(); 这将以数组形式输出时间基准的结果 该类非常简单,它基本上只是将当前的microtime()添加到一个数组中,然后在调用logResults()时将该数组吐出 /** * Retrieve h

我创建了一个自定义帮助器类模块,我将其称为:

$bench = Mage::helper('benchmark');
// ... do stuff ...
$bench->addBenchmark();
// ... more stuff ...
$bench->logResults();
这将以数组形式输出时间基准的结果

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

/**
 * 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);
}
问题是,我有一个循环,我在其中调用上面的代码,但它不是在每个循环中记录一组“新的”基准数据,而是将自身复合并添加到现有的基准数组中

我希望它每次创建一组新的基准测试
Mage::helper('benchmark')被调用

/**
 * 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);
}

非常感谢您的帮助。

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

问题在于以下几点。在
Mage.php
中,您请求的助手存储在注册表中。下一次调用时,将从注册表中检索完全相同的helper对象,而不是新对象。它仅在第一次调用助手时创建实例

/**
 * 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
时刷新最新数据。如果要将所有数据存储在帮助器中以供以后处理,是否始终返回数组中的最新键?不过,这是一个选择和口味的问题,所以我将把这部分留给你


希望这对你有所帮助

除非在调用
addBenchmark
方法时手动刷新数组的内容,否则不可能使用帮助程序

问题在于以下几点。在
Mage.php
中,您请求的助手存储在注册表中。下一次调用时,将从注册表中检索完全相同的helper对象,而不是新对象。它仅在第一次调用助手时创建实例

/**
 * 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
时刷新最新数据。如果要将所有数据存储在帮助器中以供以后处理,是否始终返回数组中的最新键?不过,这是一个选择和口味的问题,所以我将把这部分留给你


希望这对你有所帮助

添加基准键并制作如下内容

$this->benchmarks[$key]['start'] = microtime(true);
// ... 
$this->benchmarks[$key]['finish'] = microtime(true);
因此,对于每个迭代,都将有一个开始-结束对数组

为什么不想使用Varien_分析器

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

添加基准键,并使

$this->benchmarks[$key]['start'] = microtime(true);
// ... 
$this->benchmarks[$key]['finish'] = microtime(true);
因此,对于每个迭代,都将有一个开始-结束对数组

为什么不想使用Varien_分析器

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

此外,为了进一步解释,OP应该阅读这些教程:@Tim我无法刷新数据,因为它的设计使得多个调用将创建渐进或复合基准。我试图用_构造方法刷新它,但从你的帖子中我看到它只构造了一次。除了使用getModel(),还有“更好”的替代方法吗?我的意思是,我要求助于使用普通的PHP类吗?@WackGet Helpers是专门为单例而设计的,你不能多次实例化一个helper。在这里使用Magento模型(通过Mage::getModel)是合适的。此外,为了进一步解释,OP应该阅读这些教程:@Tim我无法刷新数据,因为它的设计使得多个调用将创建渐进或复合基准。我试图用_构造方法刷新它,但从你的帖子中我看到它只构造了一次。除了使用getModel(),还有“更好”的替代方法吗?我的意思是,我要求助于使用普通的PHP类吗?@WackGet Helpers是专门为单例而设计的,你不能多次实例化一个helper。在这里使用Magento模型(通过Mage::getModel)是合适的。实际上我已经这样做了,只有“完成”由下次调用addBench时确定。这是一种自动配对。我会查一下瓦里安尤档案,谢谢。同时,有什么方法可以获得我的类的新实例吗?没有方法用标准的magemtoapi重新实例化helper。您可以使用
new My_Benchmark\u Helper\u Data()
创建新实例,但我确信这种做法会让您陷入地狱:)您能告诉我为什么在Magento编程中这样做是不好的做法吗?另一个模块可以重写您的类,因此您将引用旧版本,并且不会使用新功能。工厂方法Mage::getModel()、getSingleton()、helper()等用于获取模型、helper、块类的当前版本。实际上我已经这样做了,只有“完成”由下次调用addBench时确定。这是一种自动配对。我会查一下瓦里安尤档案,谢谢。同时,有什么方法可以获得我的类的新实例吗?没有方法用标准的magemtoapi重新实例化helper。您可以使用
new My_Benchmark\u Helper\u Data()
创建新实例,但我确信这种做法会让您陷入地狱:)您能告诉我为什么在Magento编程中这样做是不好的做法吗?另一个模块可以重写您的类,因此您将引用旧版本,并且不会使用新功能。工厂方法Mage::getModel()、getSingleton()、helper()等用于获取模型、helper、块类的当前版本。