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なら通っちゃうんですね。

*1:constってPHP5から予約語になったとか話を聞いたような…。const指定してどうなるかはしらない。

*2:useなんかも定義されてるんですね