| « ハンズフリーでも運転中の電話は危険 | DOM Based Cross Site Scripting » |
定数値への参照
リンク: http://bugs.php.net/bug.php?id=33643
追記:このエントリへのアクセスが多いので補足します。
Fatal error: Only variables can be passed by reference
直訳すると「致命的エラー:変数のみ参照渡しが可能です」となります。エラーメッセージの通りvariable(以外)の値は参照として渡せないのでエラーになっています。エラーメッセージが適切かどうかは微妙ですが、意訳すると「致命的エラー:ソースコード中に記述した定数値へのアクセスはできません」あたりが妥当と思います。当然ですがdefineで定義した定数値を返す事は可能です。PHP内部では定数は変更できない「変数」の様に実装されているからです。このエントリの「定数値」を正確に書くと「ソースコード中に記述された定数値」となります。
PHP 4.4, PHP 5.1では定数値への参照の仕様が変更されています。ここで言う定数値とはdefineで定義された定数とは違い、コンパイル時にバイトコード中の定数値となる値を指します。PHPスクリプトから定義する定数は変更不可能な変数のように実装されており、これらの定数値と全く異なります。
PHPのバグレポート33643から抜粋
<?php
class Foo {
public static function bar() {
return array('a' => '1234567890');
}
}$tmp = Foo::bar();
$var = array_pop($tmp);?>
Seems to work, but it shouldn't be down to the PHP user (imho) to
implement this as this change in PHP 5.1 breaks a lot of existing code.Reproduce code:
---------------
<?phpclass Foo {
public static function bar() {
return array('a' => '1234567890');
}
}$var = array_pop(Foo::bar());
?>
Expected result:
----------------
$var = '1234567890';
Foo::bar() gets placed in temporary variableActual result:
--------------
Fatal error: Only variables can be passed by reference
array()で定義した配列定数をreturn文で返す場合、戻り値を変数に格納せず直接使用すると定数値にアクセスしたこととなり致命的エラー(E_ERROR)が発生します。
古いPHPでこのようなアクセスが行えた事は問題であるため、前の動作に戻されないでしょう。
追記:
この修正の元となったバグレポート
http://bugs.php.net/bug.php?id=29423