PHP5, PHP4 関数定義の違いあれこれ
zend_language_parser.y内の関数の引数定義の部分。php5.2.2とphp4.4.7で結構違う。
php5.2.2
parameter_list: non_empty_parameter_list | /* empty */ ; non_empty_parameter_list: optional_class_type T_VARIABLE ... | optional_class_type '&' T_VARIABLE ... | optional_class_type '&' T_VARIABLE '=' static_scalar ... | optional_class_type T_VARIABLE '=' static_scalar ... | non_empty_parameter_list ',' optional_class_type T_VARIABLE ... | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE ... | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' static_scalar ... | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' static_scalar .... ;
php4.4.7
parameter_list: non_empty_parameter_list | /* empty */ ; non_empty_parameter_list: T_VARIABLE ... | '&' T_VARIABLE ... | T_CONST T_VARIABLE ... | T_VARIABLE '=' static_scalar ... | non_empty_parameter_list ',' T_VARIABLE ... | non_empty_parameter_list ',' '&' T_VARIABLE ... | non_empty_parameter_list ',' T_CONST T_VARIABLE ... | non_empty_parameter_list ',' T_VARIABLE '=' static_scalar ... ;
<?php function foo(&$var = 'bar') { } ?>
ということでPHP4では無理だったけど、PHP5では参照の引数にデフォルト値がセットできるんですね。っていうのを知りました。
後、PHP4では cfunction, old_function, 引数内でのconst*1というキーワードが通るらしい。
<?php function foo(const $var) { } cfunction bar() { } ?>
old_functionは後方互換のようだ。PHPマニュアル*2
functionとcfunctionはzend_language_scanner.l内でどっちもT_FUNCTIONをreturnしているので同じっぽい。
<?php cfunction foo(const $var) { echo $var; } ?>
組み合わせるとパッと見はsyntax errorになりそうですが、4なら通っちゃうんですね。