hnwの日記

関数に見えて実は言語構造であるようなPHPキーワード一覧


追記(2009/05/10 09:25):何をもって「関数に見える」かは人によると思いますが、下記のリストはリファレンスマニュアルのURLがfunction.*.phpとなっているものを引っ張ってきました。

PHPには一見関数に見えるけど関数ではないキーワードが多く存在します。つまり、PHPの言語の解釈として関数とは異なる処理をしている関数モドキが何個かあるのです。具体的には、他の関数については関数名の解釈はparserが行うのですが、この「関数に見えるけど言語構造」についてはlexer(tokenizerとも呼ばれます)レベルで別のトークンとして解釈されます。


そんなキーワードをZend/zend_language_scanner.lから抜粋してみました。


これらは他の関数とは挙動が違います。言い換えると、関数の枠組みでは実現できないことを実現しています。例えば、echoに()をつけなくてもエラーにならない理由や、isset()が未定義の引数を受け取ってもNoticeを出さない理由は、これらが関数ではないからです。PHPでコードを書く人は「あ、そんなこともあるんだ」くらいは知っておいた方が良いでしょう。今まで謎だったエラーの意味がわかったりするかもしれません。

'); $entries_chunk.insertBefore(sections[0]); } else { chunk_id += 1; var $prev_entries_chunk = $entries_chunk; var $read_more_link = $('

これ以前の記事を表示する

'); $read_more_link.on('click', {chunk_id: chunk_id}, function(e){ $(e.target).hide(); $(this).remove(); $('#entries-chunk-' + e.data.chunk_id).fadeIn("slow"); }); $prev_entries_chunk.append($read_more_link); var $entries_chunk = $('
'); $entries_chunk.hide(); $entries_chunk.insertAfter($prev_entries_chunk); } } $(sections[i]).appendTo($entries_chunk); } });