我在使用商店中的其中一种Payment方法时发现了这一麻烦,并且似乎是PHP解释器错误或某些我不知道的功能。
最近我们转移到PHP7.2,其中一种付款方式出现此错误:
Uncaught Error: [] operator not supported for strings in /var/www/store/app/code/core/Mage/Eav/Model/Entity/Abstract.php on line 990
代码如下:
protected function _loadModelAttributes($object)
{
if (!$object->getId()) {
return $this;
}
Varien_Profiler::start('__EAV_LOAD_MODEL_ATTRIBUTES__');
$selects = array();
foreach (array_keys($this->getAttributesByTable()) as $table) {
$attribute = current($this->_attributesByTable[$table]);
$eavType = $attribute->getBackendType();
$select = $this->_getLoadAttributesSelect($object, $table);
$selects[$eavType][] = $this->_addLoadAttributesSelectFields($select, $table, $eavType);
}
$selectGroups = Mage::getResourceHelper('eav')->getLoadAttributesSelectGroups($selects);
foreach ($selectGroups as $selects) {
if (!empty($selects)) {
$select = $this->_prepareLoadSelect($selects);
$values = $this->_getReadAdapter()->fetchAll($select);
foreach ($values as $valueRow) {
$this->_setAttributeValue($object, $valueRow);
}
}
}
Varien_Profiler::stop('__EAV_LOAD_MODEL_ATTRIBUTES__');
return $this;
}
但是正如您在XDebug中看到的那样,操作数是一个空数组,其中没有任何字符串。我试图以交互方式重复该操作,但是我的PHP版本可以正常使用。
此外,它是Magento 1中最常用的方法之一,并且可以从任何其他模块或代码的一部分中调用它。因此,该错误仅在特定的调用跟踪中发生。
很明显,如果我们显式声明一个数组,则不会引发错误:
$selects[$eavType] = array();
$selects[$eavType][] = $this->_addLoadAttributesSelectFields($select, $table, $eavType);
但是发生错误的事实使我认为PHP7.2解释器中的隐式array_push
声明有问题。
任何想法会导致什么?某种范围或全局变量问题?值得深入研究并报告PHP7.2错误吗?还是应该检查一下我可能没有注意到的内容?
谢谢。
更新1:
我添加了一些类型检查和var_dump
,因为我认为XDebug并不总是准确的。但是结果比我预期的要怪。
这是调试代码:
$selects = array();
foreach (array_keys($this->getAttributesByTable()) as $table) {
$attribute = current($this->_attributesByTable[$table]);
$eavType = $attribute->getBackendType();
$select = $this->_getLoadAttributesSelect($object, $table);
echo gettype($selects);
var_dump($selects);
echo gettype($selects[$eavType]);
$selects[$eavType][] = $this->_addLoadAttributesSelectFields($select, $table, $eavType);
}
结果如下:
array
/var/www/store/app/code/core/Mage/Eav/Model/Entity/Abstract.php:992:
array (size=0)
empty
string
如您所见,空数组中的键之一是字符串(gettype($selects[$eavType])
)。那怎么会发生?
更新2:
似乎是XDebug相关的错误。如果您不加载XDebug扩展,一切都很好,但是即使禁用了XDebug却加载了该错误,也可能发生。由于有人可能会遇到类似的问题,并且在这里进行交流似乎要容易得多,因此将使问题开放一段时间。