フォームから渡された値があるか確認するのに、こんなコードを書いた。
1 2 3 4 |
|
このコード、よく見ると変だ。$_POST['comment']
がない場合、issetが関数だと考えると、関数を評価する前に$_POST['comment']
が評価され、Undefined indexのNoticeエラーが出るべき。例えば次のようなコードをインタラクティブモードで実行すると、Noticeエラーが出る。
1 2 |
|
なぜissetの場合、Noticeエラーを出さないのか?
調べると、issetは関数ではなく、ifやelseのようなキーワードの仲間であることがわかった。関数を評価する前の、字句解析の時点で別モノとして扱われる。関数っぽい外見だが中身はキーワード、というのは他にもいくつかある。empty
やunset
など。
このスライドに字句解析後のトークンとしてT_ISSET
が含まれている。
http://ja.scribd.com/doc/18171982/PHP-Compiler-Internals#page=17
コードレベルだと、Zend/zend_language_parser.y
で処理されている。
https://github.com/php/php-src/blob/094d409b3d34c51f49e0121e5ccfe8b2a717aaf6/Zend/zend_language_parser.y#L195