这是一个错误还是我错了?

时间:2011-02-28 12:11:05

标签: php magento

/**
 * Returns nodes found by xpath expression
 *
 * @param string $xpath
 * @return array
 */
public function getXpath($xpath)
{
    if (empty($this->_xml)) {
        return false;
    }

    if (!$result = @$this->_xml->xpath($xpath)) {
        return false;
    }

    return $result;
}

此代码取自Magento。您可以在公共svn中查看特定文件:

http://svn.magentocommerce.com/source/branches/1.5/lib/Varien/Simplexml/Config.php

现在我认为(!$result = @$this->_xml->xpath($xpath))永远不会评估为true,因此return false语句永远不会发生。

因为xpath的返回值的赋值,无论它对变量$result是真还是假,总是返回true,否则总是返回false

所以这是一个错误或完全冗余的代码,或者我错了?

仅供参考:我正在调试一些问题,其中一些配置元素“丢失”,我认为错误就在那里。

4 个答案:

答案 0 :(得分:4)

这是建立这样一个条件的奇怪方式,但我认为这是有道理的。

$result =会将xpath操作的结果分配给$result

如果结果为false(如果出现错误,xpath()将返回一个值),则条件将匹配,函数将返回false。

答案 1 :(得分:2)

“因为将xpath的返回值赋给变量$result总是返回true”这个陈述是错误的,我不知道为什么你得出这个结论。赋值运算符的值总是等于赋值的值,因此它很容易为假或为真(($x = false) == false

答案 2 :(得分:0)

您可以使用

进行测试
var_dump(!$result = FALSE);    // TRUE
var_dump(!$result = array());  // TRUE
var_dump(!$result = array(1)); // FALSE

因此,如果SimpleXml::xpath返回空数组或FALSE,则Magento函数将返回FALSE。否定数组将首先将其类型化为布尔值。 Empty Arrays typecasted to Boolean will be FALSE。这意味着,当您的XPath在语法上正确但没有找到任何结果时,Magento将返回FALSE

答案 3 :(得分:0)

我觉得将内部任务括起来是有帮助的:

if (! ($result = @$this->_xml->xpath($xpath)) ) {

视觉上,赋值现在是一个子任务,必须在被反转之前执行。没有额外的括号,它执行完全相同,这只是帮助您自己的代码阅读。

任何赋值命令都会返回返回的值。这使您可以执行以下操作:

$a = $b = $c = $d = $e = 'A made-up value';

$e的新值将返回$d,该值将返回$c,依此类推......