newしてすぐメソッドを呼べるようにするmoriyoshiパッチをPHP.5.2.10に当ててみた
via. 「パッチを当ててやってもいいんだぞ、お前が嫌なら」 - muddy brown thang
ただ単にパッチを5.2.10に(手動で)当てて、Zend/zend_vm_gen.phpを実行してconfigure・make・make install。
$ php -v PHP 5.2.10 (cli) (built: Aug 21 2009 18:42:46) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans $ $ cat test.php <?php $obj = new DateTime(); var_dump($obj->format('YmdHis')); var_dump(new DateTime()->format('YmdHis')); var_dump(new DateTime()->getOffset()); $ php test.php string(14) "20090823132429" string(14) "20090823132429" int(32400) $
すばらしすぎる。
とりあえず、diff取っておいた。
*** Zend/zend_language_parser.y.orig 2008-07-24 20:47:12.000000000 +0900 --- Zend/zend_language_parser.y 2009-08-21 18:04:06.000000000 +0900 *************** *** 49,51 **** %pure_parser ! %expect 2 --- 49,51 ---- %pure_parser ! %expect 4 *************** *** 555,558 **** --- 555,560 ---- | variable '=' '&' variable { zend_check_writable_variable(&$1); zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); zend_do_assign_ref(&$$, &$1, &$4 TSRMLS_CC); } + /* | variable '=' '&' T_NEW class_name_reference { zend_error(E_STRICT, "Assigning the return value of new by reference is deprecated"); zend_check_writable_variable(&$1); zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$4, &$5 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$3, &$4, &$7 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $3.u.EA.type = ZEND_PARSED_NEW; zend_do_assign_ref(&$$, &$1, &$3 TSRMLS_CC); } | T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + */ | T_CLONE expr { zend_do_clone(&$$, &$2 TSRMLS_CC); } *************** *** 789,790 **** --- 791,793 ---- | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.u.EA.type = ZEND_PARSED_FUNCTION_CALL; } + | T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); zend_do_begin_variable_parse(TSRMLS_C); $$.u.EA.type = ZEND_PARSED_NEW; } ;