Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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; }
  ;