• ベストアンサー

クラスで使用する「参照渡し」のやり方

クラスを使い始めて間もないので、ご教授願います。 PHPでMySQLからSELECT文でデータを持ってくる記述です。 関数での参照渡しは使うことが出来るので、同じように考え、下記のように記述しました。ただ、loadメソッドの最後に 「return $data;」 と書くと、一応意図する通りに実行できるのですが、これはなぜですか? 「参照渡し」ならばreturnで値を返す必要が無いのでは?と思うのですが、この一行を削ると"$article->load(&$data)"は”FALSE”になるようです。 アンパサンド「&」の位置が間違っているのでしょうか? class XXX{ function load(&$data){ $query = "SELECT * FROM テーブル名"; if(!$result = @mysql_query($query, データベースへの接続)){ echo "失敗"; } while(@$line = mysql_fetch_array($result, MYSQL_ASSOC)){ array_push($data, $line); } return $data; } } // クラスの生成 $obj = new XXX; // 配列の設定 $data = array(); if($obj ->load($data)){ print_r ($data); }else{ echo "失敗"; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

戻り値に$dataとするのは不必要ですね。 $obj ->load($data)の結果(つまりSQLが実行できたかできなかったか)を 知りたいだけならば、戻り値はtrue/falseで十分なはずです。 参照渡しとなっている$dataは、あくまでSQLで取得したレコード、 戻り値は、あくまで実行できたかできなかったかの区別。 であると考えれば分かり易いでしょうか? 最後にreturn $data;を追記すると動作する所以は、#2の方が 回答されている通りです。

PearlJam69
質問者

お礼

ありがとうございます。 >戻り値はtrue/falseで十分なはずです。 具体例をありがとうございます。 利用させて頂きます。

その他の回答 (2)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

>if($obj->load($data)){ これはXXXクラスのload()が返す値をtrue/falseでチェックしています。 returnが無い場合はnullとして判別されるので、判別式が論理否定となりifの中に入っていきません。 function test($arg) {  return $arg; } function testNUll() { } if(test(true)) {  echo "trueだよ"; } if(test(false)) {  // この中には入ってこない } if(testNull()) {  // この中にも入ってこない } もしload()を使ってデータを読み出すのであれば $obj->load(&$data); if($data){ ... とせねばなりません。 関数の成否ではなくデータそのものをチェックすると考えればよいでしょう。 関数の成否を検査するのであれば、関数の中身は全ての動作において場合分けし それぞれのパターンにおいてreturnを記述するのが良いでしょう。 そうしないとバグが発生やすくなります。

PearlJam69
質問者

お礼

ありがとうございました。 >関数の成否を検査するのであれば、関数の中身は全ての動作において場合分けし >それぞれのパターンにおいてreturnを記述するのが良いでしょう。 私は混同していたのですね。

回答No.1

<?php /* それは多分参照渡し関係ない。単純に混乱しているだけ */ class XXX{ function load($a){ //要するに戻り値void。PHPで同評価されるか正式な書は調べてないが } } $obj = new XXX; if($obj->load(5)){ //戻り値に対して真偽判定しているのであって,5に対する真偽判定ではない print "TRUE"; }else{ print "FALSE"; } ?>

PearlJam69
質問者

補足

ご回答ありがとうございます。 ですが、おっしゃっている意味が掴めません。 もう少し詳しく、ご説明いただければ幸いです。 >それは多分参照渡し関係ない 「参照渡し」ではない。という意味ですか? では、どう記述すれば、「参照渡し」にできるのでしょうか? >戻り値に対して真偽判定している はい。確かにそういう意図です。

関連するQ&A

専門家に質問してみよう