Long Text From @ryan5500

more than 140 character

なぜissetは配列にないindexを渡してもエラーにならないのか

フォームから渡された値があるか確認するのに、こんなコードを書いた。

1
2
3
4
if (isset($_POST['comment']))
{
  ...
}

このコード、よく見ると変だ。$_POST['comment']がない場合、issetが関数だと考えると、関数を評価する前に$_POST['comment']が評価され、Undefined indexのNoticeエラーが出るべき。例えば次のようなコードをインタラクティブモードで実行すると、Noticeエラーが出る。

1
2
explode(',' $_POST['value']);
// => PHP Notice:  Undefined index: value in php shell code on line 1

なぜissetの場合、Noticeエラーを出さないのか?

調べると、issetは関数ではなく、ifやelseのようなキーワードの仲間であることがわかった。関数を評価する前の、字句解析の時点で別モノとして扱われる。関数っぽい外見だが中身はキーワード、というのは他にもいくつかある。emptyunsetなど。

このスライドに字句解析後のトークンとして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