启用XDebug []不支持字符串运算符时,当操作数为空数组时,有时会发生错误

时间:2019-02-27 19:40:28

标签: php xdebug

我在使用商店中的其中一种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);

但是发生错误的事实使我认为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

Execution result

如您所见,数组中的键之一是字符串gettype($selects[$eavType]))。那怎么会发生?

更新2:

似乎是XDebug相关的错误。如果您不加载XDebug扩展,一切都很好,但是即使禁用了XDebug却加载了该错误,也可能发生。由于有人可能会遇到类似的问题,并且在这里进行交流似乎要容易得多,因此将使问题开放一段时间。

0 个答案:

没有答案