Я пытался сделать простое утверждение PHP, чтобы проверить, что строка не пуста, но получил неверные результаты.
Я не знал о функции оценки строки в assert (), но проверилДокументы и понял, что часть.
Я включил код со всеми тестовыми примерами, затем вывод, а затем вопросы.Когда случай завершается с синтаксической ошибкой, я просто комментирую его и повторяю тест, чтобы можно было выполнить следующие случаи, и я показываю вывод для каждого выполнения.
Код предназначен для определения местоположения элемента XML с использованием 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;
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 ] )
?>
И вот выходы выполнения - снова обратите внимание, что есть комментирование фатального сбоя синтаксиса и повторное выполнение, вы можете просто предположить, что каждое утверждение было проверено отдельно:
#tests#php -v
PHP 5.3.3-7+squeeze3 with Suhosin-Patch (cli) (built: Jun 28 2011 13:13:26)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 00 ------>
PHP Parse error: syntax error, unexpected ':' in /shared/tests/vars.php(40) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:40
PHP Catchable fatal error: assert(): Failure evaluating code:
apl:dept in /shared/tests/vars.php on line 40
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:40
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 01 ------>
PHP Parse error: syntax error, unexpected ':' in /shared/tests/vars.php(43) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:43
PHP Catchable fatal error: assert(): Failure evaluating code:
apl:dept in /shared/tests/vars.php on line 43
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:43
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 02 ------>
------ assertion 03 ------>
------ assertion 04 ------>
PHP Parse error: syntax error, unexpected ':' in /shared/tests/vars.php(52) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:52
PHP Catchable fatal error: assert(): Failure evaluating code:
apl:dept!=='' in /shared/tests/vars.php on line 52
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:52
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 02 ------>
------ assertion 03 ------>
------ assertion 05 ------>
PHP Parse error: syntax error, unexpected ':' in /shared/tests/vars.php(55) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:55
PHP Catchable fatal error: assert(): Failure evaluating code:
apl:dept!=='' in /shared/tests/vars.php on line 55
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:55
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 02 ------>
------ assertion 03 ------>
------ assertion 06 ------>
PHP Warning: assert(): Assertion failed in /shared/tests/vars.php on line 58
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:58
------ assertion 07 ------>
------ assertion 08 ------>
PHP Warning: assert(): Assertion "!empty($xr->name)" failed in /shared/tests/vars.php on line 64
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:64
------ assertion 09 ------>
------ assertion 10 ------>
PHP Parse error: syntax error, unexpected ':', expecting T_PAAMAYIM_NEKUDOTAYIM in /shared/tests/vars.php(70) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:70
PHP Catchable fatal error: assert(): Failure evaluating code:
!empty(apl:dept) in /shared/tests/vars.php on line 70
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:70
#tests#php -q vars.php
---------------- Test Results ---------------->
----- var ==apl:dept==
----- xr name==apl:dept==
------ assertion 02 ------>
------ assertion 03 ------>
------ assertion 06 ------>
PHP Warning: assert(): Assertion failed in /shared/tests/vars.php on line 58
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:58
------ assertion 07 ------>
------ assertion 08 ------>
PHP Warning: assert(): Assertion "!empty($xr->name)" failed in /shared/tests/vars.php on line 64
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:64
------ assertion 09 ------>
------ assertion 11 ------>
PHP Parse error: syntax error, unexpected ':', expecting T_PAAMAYIM_NEKUDOTAYIM in /shared/tests/vars.php(73) : assert code on line 1
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:73
PHP Catchable fatal error: assert(): Failure evaluating code:
!empty(apl:dept) in /shared/tests/vars.php on line 73
PHP Stack trace:
PHP 1. {main}() /shared/tests/vars.php:0
PHP 2. assert() /shared/tests/vars.php:73
Теперь некоторые комментарии:
Случаи 1,2 понятны - то есть "особенность" оценки строки.
Все случаи с выражением утверждения, заключенным в двойные кавычки -разобрался и с ними: сначала выполняется разбор переменных, что приводит к синтаксической ошибке при выполнении.Поэтому, чтобы пример 4 работал, например, мы можем сделать:
echo "------ assertion 04 ------>\n";
assert ("'{$xr->name}'!==''");
Теперь реальная проблема связана со случаями 6,7.Почему 6 не удается, а 7 - успешно.То же самое касается случаев, когда 8,9 - 8 терпят неудачу, а 9 - успешны.
С уважением.