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