Я обнаружил эту проблему при работе с одним из методов 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);
Но тот факт, что ошибка возникает, заставляет меняПодумайте, что что-то не так с неявным объявлением array_push
в интерпретаторе PHP7.2.
Есть идеи, что может вызвать это?Какие-то проблемы в области видимости или глобальных переменных?Стоит ли копать глубже и сообщать об ошибке 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
Как видите, тип одного из ключей в массиве empty представляет собой string (gettype($selects[$eavType])
).Как это могло произойти?
ОБНОВЛЕНИЕ 2:
Похоже, это ошибка, связанная с XDebug.Все в порядке, если вы не загружаете расширение XDebug, но ошибка может произойти, даже если у вас отключен, но загружен XDebug.Будет держать вопрос открытым в течение некоторого времени, потому что кто-то может столкнуться с подобной проблемой, и кажется, что здесь гораздо проще общаться.