2

私はFacebookのphpshと標準のくだらないphpの両方で次のコードを試しました-replの忌まわしさ:

$a = NULL;
echo $a['foobar'];

残念ながら(PHPに関しては、驚きや失望とは言いませんが)エラー、警告、例外などは発生しません。

RubyやPythonなどのよりスマートな言語は、キーをNoneやnilなどから逆参照しようとすると、どちらも文句を言います。PHPはこの状況をどのように解釈していますか?is_nullチェックをどこにでも挿入する唯一の治療法はありますか?Smartyが私のためにそれをしなかったことを非難すべきですか?

4

1 に答える 1

2

PHPのソースコード(Zend/zend_execute.c)によると、オフセット/インデックスにアクセスするときにエラーをトリガーできるのは、文字列、配列、およびオブジェクトのみです。残りは多かれ少なかれ無視されます:

$a = true;
$b = false;
$c = null;
$d = 1;
$e = 1.234;
$f = '';
$g = array();
$h = new stdClass;

echo $a[0]; // NULL
echo $b[0]; // NULL
echo $c[0]; // NULL
echo $d[0]; // NULL
echo $e[0]; // NULL
echo $f[0]; // E_NOTICE: Uninitialized string offset
echo $g[0]; // E_NOTICE: Undefined offset
echo $h[0]; // E_FATAL:  Cannot use object as array

、、、、または実際$aにエラーを吐き出すことはありません。ほとんどの場合、コードではorが表示されます。これは、返された(ポインター)または呼び出しではなく、NULLを意味します。したがって、上記の結果。$b$c$d$ereturn;return 0;zval*zend_error()

このように行われた理由が何であれ、それは実際には問題ではありません。このような場合は、変数の存在や無効を常にチェックする必要があります。最も安全な方法(わずかに異なる動作)は次issetemptyとおりです。

isset($a['foo']);
!empty($a['foo']);    
于 2011-04-14T15:59:59.580 に答える