1

文字列が空でないことを確認するために単純な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 ] )


?>

そして、ここに実行出力があります-致命的な構文の失敗と繰り返しの実行についてコメントアウトされていることに再度注意してください。各アサーションが別々にテストされたと仮定することができます。

#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にあります。7が成功しているのに6が失敗するのはなぜですか。ケース8、9〜8が失敗し、9が成功した場合も同じです。

よろしく。

4

2 に答える 2

2

それはassert()がどのように機能するかではなく、empty()がどのように機能するかについてです。
emptyで使用する$object->inaccessiblePropと、最初にisset()と同じことを試み、この「テスト」がfalseを返す場合、empty()は要素にアクセスしようとさえしませんが、trueを返します。
また、XMLReaderクラスは、明らかに__isset()メソッドを必要な方法で実装していません。

<?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
于 2011-07-27T08:05:35.097 に答える
0

Now the real issue is with cases 6,7. Why is 6 failing while 7 is succeeding. The same with cases 8,9 - 8 failing while 9 succeeding.

スカラー型ではなかったからです。

于 2011-07-27T06:35:01.730 に答える