При включенном XDebug [] Оператор не поддерживается для строк. Иногда возникает ошибка, когда операнд является пустым массивом. - PullRequest
0 голосов
/ 27 февраля 2019

Я обнаружил эту проблему при работе с одним из методов 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 все работает нормально.

XDebug breakpoint on the line that causes error

Более того, это один из наиболее распространенных методов в 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

Execution result

Как видите, тип одного из ключей в массиве empty представляет собой string (gettype($selects[$eavType])).Как это могло произойти?

ОБНОВЛЕНИЕ 2:

Похоже, это ошибка, связанная с XDebug.Все в порядке, если вы не загружаете расширение XDebug, но ошибка может произойти, даже если у вас отключен, но загружен XDebug.Будет держать вопрос открытым в течение некоторого времени, потому что кто-то может столкнуться с подобной проблемой, и кажется, что здесь гораздо проще общаться.

...