フォームから渡された値があるか確認するのに、こんなコードを書いた。
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