PHP assert()究竟是如何工作的?

PHP assert()究竟是如何工作的?,php,assertion,Php,Assertion,我试图做一个简单的PHP断言来验证字符串是否为空,但得到了令人困惑的结果 我不知道assert()中的字符串求值功能,但检查了文档并理解了该部分 我将代码和所有测试用例放在一起,然后是输出,然后是问题。当一个案例因语法错误而失败时,我只是注释掉它并重复测试,以便执行以下案例,并显示每次执行的输出 代码是关于使用XMLReader定位XML元素的,但这恰好是我的代码。下面是代码: <?php $xml = <<< XML <depts xmlns:apl="urn

我试图做一个简单的PHP断言来验证字符串是否为空,但得到了令人困惑的结果

我不知道assert()中的字符串求值功能,但检查了文档并理解了该部分

我将代码和所有测试用例放在一起,然后是输出,然后是问题。当一个案例因语法错误而失败时,我只是注释掉它并重复测试,以便执行以下案例,并显示每次执行的输出

代码是关于使用XMLReader定位XML元素的,但这恰好是我的代码。下面是代码:

<?php

$xml = <<< XML
<depts  xmlns:apl="urn:my:ns" >
    <apl:dept>Dept One</apl:dept>
    <apl:dept>Dept Tow</apl:dept>
</depts>
XML;


$elmLocal = 'dept';
$elmUrn = "urn:my:ns";

$xr = new XMLReader;
$xr->XML($xml);

// move to the first desired element node
$found = false;
while ($xr->read()) {
    if ($xr->localName === $elmLocal && $xr->namespaceURI === $elmUrn) {
        $found = true;
        break;
    }
}
if (!$found) {
    exit("---Error--- No element found with given Name/NS.\n");
}



$var = $xr->name;

echo "---------------- Test Results ---------------->\n";

echo "----- var    =={$var}==\n";
echo "----- xr name=={$xr->name}==\n\n";


echo "------ assertion 00 ------>\n";
assert ($xr->name);

echo "------ assertion 01 ------>\n";
assert ($var);

echo "------ assertion 02 ------>\n";
assert ('$xr->name!==""');   

echo "------ assertion 03 ------>\n";
assert ('$var!==""');   

echo "------ assertion 04 ------>\n";
assert ("{$xr->name}!==''");   

echo "------ assertion 05 ------>\n";
assert ("{$var}!==''");   

echo "------ assertion 06 ------>\n";
assert(!empty($xr->name));

echo "------ assertion 07 ------>\n";
assert(!empty($var));

echo "------ assertion 08 ------>\n";
assert('!empty($xr->name)');

echo "------ assertion 09 ------>\n";
assert('!empty($var)');

echo "------ assertion 10 ------>\n";
assert("!empty({$xr->name})");

echo "------ assertion 11 ------>\n";
assert("!empty({$var})");



// do some processing
$domNode = $xr->expand(); // DOMNode XMLReader::expand ([ DOMNode $basenode ] )


?>
现在有一些评论:

案例1、2是可以理解的——即字符串求值“特征”

断言表达式用双引号括起来的所有情况也都解决了:首先进行变量解析,这会导致执行中出现语法错误。因此,为了使案例4起作用,我们可以:

echo "------ assertion 04 ------>\n";
assert ("'{$xr->name}'!==''");   
现在真正的问题是案例6,7。为什么6失败了而7成功了。同样的情况8,9-8失败,9成功


尊敬。

现在真正的问题是案例6、7。为什么6失败了而7成功了。案例8、9-8失败,而案例9成功的情况也是如此。

因为它不是标量类型

问题不在于assert()如何工作,而在于empty()如何工作。
$object->incaccessibleprop一起使用时,empty首先尝试与isset()相同的操作,如果此“测试”返回false,empty()甚至不尝试访问元素,而是返回true。
XMLReader类显然没有按照您需要的方式实现该方法

<?php
$xml = <<< XML
<depts  xmlns:apl="urn:my:ns" >
    <apl:dept>Dept One</apl:dept>
    <apl:dept>Dept Tow</apl:dept>
</depts>
XML;

$elmLocal = 'dept';
$elmUrn = "urn:my:ns";

$xr = new XMLReader;
$xr->XML($xml);

// move to the first desired element node
$found = false;
while ($xr->read()) {
    if ($xr->localName === $elmLocal && $xr->namespaceURI === $elmUrn) {
        $found = true;
        break;
    }
}
if (!$found) {
    exit("---Error--- No element found with given Name/NS.\n");
}

$var = $xr->name;
var_dump(isset($xr->name));
var_dump(empty($xr->name));
echo $xr->name;

什么不是标量类型?!将其声明为字符串:public readonly string$name;我认为你的断言方式,在你上面提到的所有失败的断言中,例如
assert(“!empty($xr->name)”使其不作为字符串变量/标量类型进行计算。不清楚-能否解释案例6和案例7之间的差异。
<?php
$xml = <<< XML
<depts  xmlns:apl="urn:my:ns" >
    <apl:dept>Dept One</apl:dept>
    <apl:dept>Dept Tow</apl:dept>
</depts>
XML;

$elmLocal = 'dept';
$elmUrn = "urn:my:ns";

$xr = new XMLReader;
$xr->XML($xml);

// move to the first desired element node
$found = false;
while ($xr->read()) {
    if ($xr->localName === $elmLocal && $xr->namespaceURI === $elmUrn) {
        $found = true;
        break;
    }
}
if (!$found) {
    exit("---Error--- No element found with given Name/NS.\n");
}

$var = $xr->name;
var_dump(isset($xr->name));
var_dump(empty($xr->name));
echo $xr->name;
bool(false)
bool(true)
apl:dept