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を勉強してみようかな。どんどん脱線していくけど。
もちろん、拡張機能を Zend エンジンに直接組み込むこともできます。 言語そのものの振る舞いを変更したい場合、あるいは言語のコアに 特別な関数を直接組み込む必要がある場合などには、この方式がよいでしょう。しかし、一般的には Zend エンジンを変更することは避けるべきです。
あ。はい。ごめんなさい!