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、块类的当前版本。