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

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2007/01/11 13:33:37
  • 終了:2007/01/18 13:35:03

回答(2件)

id:stephanie No.1

stephanie回答回数29ベストアンサー獲得回数22007/01/11 15:38:11

ポイント35pt

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

id:p_question

ありがとうございます。

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

  • なぜこのような書き方の場合、Noticeになるようになったのでしょうか?
  • new MyObject() には何が入っているのでしょうか? オブジェクトの気がしますが、なぜ直接返してはいけないのでしょうか?
  • myProc()は、変数ではないことがわかりましたが、何が入っているのでしょうか?

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

2007/01/11 19:47:14
id:stephanie No.2

stephanie回答回数29ベストアンサー獲得回数22007/01/12 13:14:22

ポイント35pt

>>なぜこのような書き方の場合、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

id:p_question

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

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

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

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

2007/01/13 11:36:46
  • id:b-wind
    >GPLのソフト
    ソフト名は書いたほうが良いと思いますが。
    あと GPL であることは関係ないでしょうね。
  • id:p_question
    ソフト名は、諸事情がありまして公表ができません。申し訳ありません。
  • id:p_question
    大変親切に回答ありがとうございます。

    ちょっとまだはてなの使い方がよくわかっておらず、ご迷惑をかけているような気がします。

    とても丁寧に回答して頂いているので申し訳なくなってきています。途中から付与ポイントを増やすことってできないのですよね?
    できないのであれば、別の質問として登録しようかと思っております。
  • id:stephanie
    私もまだ人力検索で解答をはじめて日が浅いのでまだ使い方があまり分かっておらず、2回目の解答はコメントに書くべきであったかもしれません…。申し訳ありません。

    変数名がない値を参照出来ないのは恐らくZend Engineの仕様と思われますが、私にはこれ以上の詳しいことは分からないです。申し訳ありません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません