PHPのバージョンとallow_call_time_pass_referenceの関係

php5.2で動作していたソースをphp5.3で動作させると、以下のような警告が出る。

Deprecated: Call-time pass-by-reference has been deprecated in ***.php

これは、関数のコール時に引数が参照で渡された場合に警告するかどうか(allow_call_time_pass_reference)がoffになっているためであり、PHP5.3のデフォルトは off になっている。


これを簡単に回避するには、.htaccessphp.ini に以下を追加する。

php_flag allow_call_time_pass_reference on

但し、php5.4では「allow_call_time_pass_reference」は無効となるため、ソースを修正するのが良い。


allow_call_time_pass_reference
http://www.php.net/manual/ja/ini.core.php#ini.allow-call-time-pass-reference


実際にどのようになるか、PHPのバージョン毎にチェックしてみた。

ソースは以下の3種類を用意。

a.php:関数宣言と呼び出しの両方の引数を参照渡しを記述
b.php:関数宣言のみ引数を参照渡しで記述
c.php:関数呼び出しのみ引数を参照渡しで記述

a.php

$a=1;
test(&$a);
print $a;

function test(&$data){
  $data++;
}


b.php

$a=1;
test($a);
print $a;

function test(&$data){
  $data++;
}


c.php

$a=1;
test(&$a);
print $a;

function test($data){
  $data++;
}


動作結果は以下の通り。

Version a.php b.php c.php
PHP 5.2 2 2 2
PHP 5.3 2, Deprecated 2 2, Deprecated
PHP 5.4 Fatal error 2 Fatal error


php5.2では、全て動作する。警告も出ない。

php5.3では、全て動作するが、呼び出しの引数に参照渡しがあると警告が出る。

Deprecated: Call-time pass-by-reference has been deprecated in ?.php on line ?

php5.4では、呼び出しの引数に参照渡しがあると動作しない。

Fatal error: Call-time pass-by-reference has been removed in ?.php on line ?