当创建用于商业用途的扩展时,如果它可以在多个Magento版本上工作,可能还不错,也许还有CE和EE。
但是有时这不能按计划进行,因为核心会随着版本的变化而变化。
我的问题是,我应该如何处理影响我的扩展的微小核心变更。我并不是在谈论需要重构的巨大变化。
这是一个使它更清楚的示例。
从CE 1.8.1(和EE 1.13.1)开始,该方法Varien_Io_File::write
改变了它的工作方式(签名相同),并且该方法的filePutContent
作用类似于write
以前的操作。
现在,我做些骇人听闻的事情,并检查Magento的版本,以了解使用哪种方法来达到相同的结果
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
现在,我希望它也可以在EE上工作。由于1.8.1专门针对CE,因此变得更加难看。所以上面的代码变成
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
方法getCurrentVersion
看起来像这样
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
上面的代码有点简化(我在真实代码中为版本使用了适当的常量)
但这在CE 1.7及更高版本中适用Mage::getEdition()
。如果我想让它在ce 1.7之前的版本上运行,它将变得更加疯狂。
现在,想象一下在CE 1.11和EE 1.16版本中再次发生这种变化。混乱必将发生。
有没有这样做if
或case
声明的更干净的方法?
@Mayers。您应该将此作为答案。看起来是一种有效的方法。不是一个完美的,但实际上是一个有效的:)
—
马吕斯
method_exists
(method_exists ( mixed $object , string $method_name )
)函数,该函数的限制较少且更可靠。