アプリ版:「スタンプのみでお礼する」機能のリリースについて

クラスを使い始めて間もないので、ご教授願います。
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 "失敗";
}

A 回答 (3件)

戻り値に$dataとするのは不必要ですね。



$obj ->load($data)の結果(つまりSQLが実行できたかできなかったか)を
知りたいだけならば、戻り値はtrue/falseで十分なはずです。

参照渡しとなっている$dataは、あくまでSQLで取得したレコード、
戻り値は、あくまで実行できたかできなかったかの区別。
であると考えれば分かり易いでしょうか?

最後にreturn $data;を追記すると動作する所以は、#2の方が
回答されている通りです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2008/02/04 22:21

>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を記述するのが良いでしょう。
そうしないとバグが発生やすくなります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

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

お礼日時:2008/02/04 22:19

<?php


/* それは多分参照渡し関係ない。単純に混乱しているだけ */
class XXX{
function load($a){ //要するに戻り値void。PHPで同評価されるか正式な書は調べてないが


}
}

$obj = new XXX;
if($obj->load(5)){ //戻り値に対して真偽判定しているのであって,5に対する真偽判定ではない
print "TRUE";
}else{
print "FALSE";
}

?>

この回答への補足

ご回答ありがとうございます。
ですが、おっしゃっている意味が掴めません。
もう少し詳しく、ご説明いただければ幸いです。

>それは多分参照渡し関係ない
「参照渡し」ではない。という意味ですか?
では、どう記述すれば、「参照渡し」にできるのでしょうか?

>戻り値に対して真偽判定している
はい。確かにそういう意図です。

補足日時:2008/02/03 22:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!