Y!のPHPエンジニア問題の $users ||= ‘john’;

Do You PHP はてな - Yahoo!がPHPエンジニアを雇う時に聞く質問

1.配列usersに「john」を追加しないのはどれか?

         1. $users[] = ‘john’;
         2. array_add($users,’john’);
         3. array_push($users,‘john’);
         4. $users ||= ‘john’;

捻くれた性格なので、$users ||= ‘john’;これで動いたらそれはそれで面白いんじゃないかと思ったり。(何か間違ってるけど。

「||=」は配列へのpushより、Rubyの自己代入のように動いた方が嬉しいと思いつつも、
PHPのパーサがどうやって動いてるのかを調べつつ、

  • zend_language_scanner.l
  • zend_language_parser.c
  • zend_language_parser.h
  • zend_language_scanner.c
  • zend_language_parser.y
  • zend_vm_opcodes.h
  • zend_vm_def.h
  • zend_opcode.c
  • zend_operators.c
  • zend_operators.h

…等などを弄って何とか「||=」をオペーレタとして認識してSyntaxが通るようになるまでは結構簡単だったのだが、実装途中で…。

$ php -r '$users ||= "john";'
Segmentation fault

自分なんかの力で数時間で簡単に作れるほど甘くはないみたい。でもちょっと楽しいかも。
週末にもうちょっとしっかりZendEngineを勉強してみようかな。どんどん脱線していくけど。



PHPマニュアル

もちろん、拡張機能を Zend エンジンに直接組み込むこともできます。 言語そのものの振る舞いを変更したい場合、あるいは言語のコアに 特別な関数を直接組み込む必要がある場合などには、この方式がよいでしょう。しかし、一般的には Zend エンジンを変更することは避けるべきです。

あ。はい。ごめんなさい!