クラスを使い始めて間もないので、ご教授願います。
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の方が
回答されている通りです。
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を記述するのが良いでしょう。
そうしないとバグが発生やすくなります。
ありがとうございました。
>関数の成否を検査するのであれば、関数の中身は全ての動作において場合分けし
>それぞれのパターンにおいてreturnを記述するのが良いでしょう。
私は混同していたのですね。
No.1
- 回答日時:
<?php
/* それは多分参照渡し関係ない。単純に混乱しているだけ */
class XXX{
function load($a){ //要するに戻り値void。PHPで同評価されるか正式な書は調べてないが
}
}
$obj = new XXX;
if($obj->load(5)){ //戻り値に対して真偽判定しているのであって,5に対する真偽判定ではない
print "TRUE";
}else{
print "FALSE";
}
?>
この回答への補足
ご回答ありがとうございます。
ですが、おっしゃっている意味が掴めません。
もう少し詳しく、ご説明いただければ幸いです。
>それは多分参照渡し関係ない
「参照渡し」ではない。という意味ですか?
では、どう記述すれば、「参照渡し」にできるのでしょうか?
>戻り値に対して真偽判定している
はい。確かにそういう意図です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Resource id #3 と表示されま...
-
TEXTAREAに書いた改行コードを...
-
別ファイルの構造体の値を読み...
-
VBAでcsvファイルもシートもあ...
-
文字列変換について
-
【PHP】csvファイルへの書き出...
-
fsockopen関数について
-
複数行のデータのPOST処理に関して
-
エラーメッセージ(無効な間接...
-
stdClass Objectを連想配列のよ...
-
smartyでページングするには
-
php Undefined variableエラー
-
PHPのアクセスカウンターのバグ...
-
ラジオボタンのチェックの付け方。
-
rubyで複数列のデータを一行に...
-
クラスで使用する「参照渡し」...
-
PHP5でCSVの指定行データだけを...
-
$a[x]と$a['x']
-
デザインとプログラムの分離
-
配列同士の足し算のループ処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Resource id #3 と表示されま...
-
ヒアドキュメントの中のfor文
-
CSVファイルの最終行のデー...
-
PHPでCSVの一部の行を編集したい
-
別ファイルの構造体の値を読み...
-
エラーメッセージ(無効な間接...
-
複数行のデータのPOST処理に関して
-
UTF-8のXMLがSJISのPHPで文字化け
-
csvの内容を行単位で削除したい
-
curlをPHPで書く方法
-
PHP: 未定義エラーの回避方法を...
-
PHP SimpleXml unsetについて
-
stdClass Objectを連想配列のよ...
-
C言語でCSVファイルの行数を読...
-
FortranのOPEN文
-
PHP、CSVファイルの日本語デー...
-
array_multisortについて
-
CSVでアップロードしたデータの...
-
テキストデータから指定行の削除
-
文字列変換について
おすすめ情報