人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP4でGPLのソフトを利用していますが、PHP4.4.0以降の仕様変更によって、以下のNoticeが出ます。これが出ないように修正をしたいです。
参照返し、値返しで、入れた値と返した値のミスマッチの問題ということは理解しています。
function &exaple()の&の意味や使い方、どう意味で、どのように修正すれば良いのでしょうか?

Notice [PHP]: Only variable references should be returned by reference in file
Notice [PHP]: Only variables should be assigned by reference in file

●質問者: p_question
●カテゴリ:ウェブ制作
✍キーワード:GPL [php] ソフト ミスマッチ 仕様変更
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● stephanie
●35ポイント

Only variable references should be returned by referenceは戻り値を参照で渡さないといけない場合に直接返していたりすると発生しますので以下のように修正します。

function &newMyObject(){
 return new MyObject();
}

から

function &newMyObject(){
 $obj = new MyObject();
 return $obj;
}

Only variables should be assigned by referenceは変数以外(定数など)を参照渡ししようとしているので以下のように修正します。

define('S_OK', 1);
function myProc(){
 return S_OK;
}
$result =& myProc();

から

define('S_OK', 1);
function myProc(){
 return S_OK;
}
$result = myProc();

また、error_reporting(E_ALL ^ E_NOTICE);を呼ぶことによりNOTICEメッセージは無視する事も可能です。

http://jp.php.net/manual/ja/function.error-reporting.php

◎質問者からの返答

ありがとうございます。

何度も読み返してみたのですが、基本がわかっていないためか、どうしてそのような修正になるのかがちょっと理解できませんでした。

引き続き、よろしくお願いします。


2 ● stephanie
●35ポイント

>>なぜこのような書き方の場合、Noticeになるようになったのでしょうか?

PHP 4.4.0以前は、値返しが必要な時に参照返しによる代入を行った場合でも実際の値のコピーが行われ警告などは出ませんでした。

しかしPHP 4.4.0以降はこの不適切な参照の使用に対してNOTICEメッセージでの注意を表示するようになっています。

ですので実際に動作はPHP 4.4.0以降と以前はNOTICEが表示される以外は変わりません。


>>new MyObject() には何が入っているのでしょうか? オブジェクトの気がしますが、なぜ直接返してはいけないのでしょうか?

MyObjectは例として示しただけですので特に意味はありません。

Objectを直接返していけない理由は参照による代入を行う場合には参照元に変数名が必要です。

return new MyObject(); の場合は作成されたオブジェクトを代入した変数に名前がないので警告が発生します。

これは一度変数にオブジェクトを作成し、その変数を戻り値とすることで対処可能です。


>>myProc()は、変数ではないことがわかりましたが、何が入っているのでしょうか?

myProc()も同じく例として示しただけですので意味はありません。

この場合もmyProc()が返した変数名を持たない定数を$resultに代入しようとしたことが原因で警告が発生しています。(定数自体には名前がありますがこれは変数名ではありません。)

この場合も参照渡しをやめるか一度名前のある変数に代入したあとその変数を参照渡しすることで対処可能です。

http://jp.php.net/manual/ja/language.variables.php

◎質問者からの返答

徐々に理解してきました。

このNoticeが出た場合は、こういう対策をすれば良いという点は、理解できました。ありがとうございます。

「PHPの言語仕様としてリファレンスの返り値は、変数名がなくてはNoticeになる。」という理解で良いでしょうか?

そうだとすると、なぜそうなのかがよく理解できません。「そういうものだ。仕様だ。」と言ってしまえば、そうなのでしょうが、そういう仕様になった根本的な理由も教えて頂けると、より理解が深まり、応用も利くような気がします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ