php5.2で動作していたソースをphp5.3で動作させると、以下のような警告が出る。
Deprecated: Call-time pass-by-reference has been deprecated in ***.php
これは、関数のコール時に引数が参照で渡された場合に警告するかどうか(allow_call_time_pass_reference)がoffになっているためであり、PHP5.3のデフォルトは off になっている。
これを簡単に回避するには、.htaccess や php.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 ?