プロが教える店舗&オフィスのセキュリティ対策術

PHP初心者です。
オブジェクト指向を今勉強している途中でどうしても理解できないところがあるので教えてください。

----------------------------------------------------------------
<?
class ANIMAL{
var $first_weight;
var $weight;
var $soul = true;
var $x = 0;
var $y = 0;
function ANIMAL($weight){
$this->first_weight = $this->weight = $weight;
$this->old = $old;
}
function walk($x, $y){
if(!$this->soul){
return;
}
if($this->weight < $this->first_weight * 0.99){
$this->death();
return;
}
$this->x += $x;
$this->y += $y;
echo "walking... [{$x}], [{$y}]<br />";
$this->weight -= 20;
}
function death(){
$this->soul = false;
echo "I died...<br />";

}
function get_weight(){
echo "Weight... {$this->weight} g<br />";
}
function get_posi(){
echo "Position... x : {$this->x}, y : {$this->y}"."<br />";
}
}

$animal = new ANIMAL(6000);


$animal->walk(5, 2);
$animal->walk(-10, 20);
$animal->walk(2, 0);
$animal->walk(-50, 21);
$animal->walk(-11, -20);

$animal->walk(20, 30);

$animal->get_weight();
$animal->get_posi();
----------------------------------------------------------------
上記のようなプログラムがあります。
プログラムの答えの予想では、
>if($this->weight < $this->first_weight * 0.99){
移動するごとに体重が20キロ減っていき
元体重の0.99%をきった時点5940になると

  $animal->walk(2, 0);
$animal->walk(-50, 21);
$animal->walk(-11, -20);
$animal->walk(20, 30);
この部分は全て I died...になると考えていました。
また、$animal->get_weight();この部分は5000gと考えていました。

return;を入れることでなにが変わるのか、戻り値という事はわかり
ます。本を読んでいて本の中の簡単な例題では意味はなんとなくつかめるのですが、どんな時につかったらいいのか、また複雑になるとreturn;の存在する意味がわからなくなってしまいます。

ご助言いただければ幸いです。宜しくお願いします。

A 回答 (3件)

> 解釈はあっているでしょうか?


OKです。
念のため、正確にはget_posi()は現在の位置を出力するメソッドなので位置情報は
$this->x += $x;
$this->y += $y;
で蓄積しています。

私見ですが、class ANIMALのメンバとしてwalk()やdeath()は動物の動作ですが、get_weight()、get_posi()は状態を画面に出力させる為だけのメソッドで動物の動作を表現していないので、class ANIMALに並べるのは不自然だと思います。

get_weight()、get_posi()はバッサリカットして

$animal = new ANIMAL(6000);
$animal->walk(5, 2);
(省略)
echo "Weight... {$animal->weight} g<br />";
echo "Position... x : {$animal->x}, y : {$animal->y}"."<br />";

とするのがいいかな。と思いました。
    • good
    • 0
この回答へのお礼

御礼遅くなって申し訳ありません。先ほど上記kalkichiさんに書いていただいたプログラムをみて書き換えましたところ。見ため的にもすっきりです。
そして、解釈もOKということでやっと問題自体も理解をすることができました。ありがとうございます。
自分の力だけでは解けなかったと思います。
何度も聞いて、そのたびに回答をいただけて本当に感謝しております。
ありがとうございました。

お礼日時:2007/11/11 19:14

ご不明な点がいまいち把握できず質問意図と異なっていたら申し訳ないのですが、この場合



・元の体重が6000
・6000 * 0.99 = 5940以下になると死ぬ
・1回動くと-20

という事で、6000-5940=60 → 60÷20=3
で、3回動ける事になります。
ただし体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。

動作(メソッド)のたびに状態(プロパティ)を確認してみれば把握しやすいと思います。


$animal->walk(5, 2);
$animal->get_weight();
$animal->get_posi();

$animal->walk(-10, 20);
$animal->get_weight();
$animal->get_posi();

$animal->walk(2, 0);
$animal->get_weight();
$animal->get_posi();

$animal->walk(-50, 21);
$animal->get_weight();
$animal->get_posi();

$animal->walk(-11, -20);
$animal->get_weight();
$animal->get_posi();

$animal->walk(20, 30);
$animal->get_weight();
$animal->get_posi();

この回答への補足

説明が下手で本当に申し訳ありません。
上記の解答参考になりました。
3回動けることは理解していたのですが、
「体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。」とても参考になりました。

function walkで歩いた位置、(5.2)を代入し、
echo でwalking...[5][2]を出力 この時点では(1)6000g
function get_weight     この時点で5980g

となると、
(1)6000
(2)5980
(3)5960
(4)5940
(5)I died...
(6)I died...だけれど
function walk($x, $y){
if(!$this->soul){
return;
でfunction から抜けるので、出力されない
(7)weight...5920
(8)Position... x : -53, y : 43
I died...がでた時点で
if($this->weight < $this->first_weight * 0.99){
$this->death();
return;
の部分でfunctionから抜けるので、
function get_posi(){
echo "Position... x : {$this->x}, y : {$this->y}"."<br />";
}
に蓄積されない。
で解釈はあっているでしょうか?
長々と申し訳ないです。宜しくお願いします。

補足日時:2007/11/08 21:20
    • good
    • 0

元体重の0.99%を切った時点で死ぬので後の処理(walking)をさせない為にreturn;でfunctionを抜けてます。

この回答への補足

解答ありがとうございます。この例題のreturnについての理解は完璧とはいえませんが、どういう時につかうのかは理解できました。
ありがとうございます。
実は、書き方不足でもうしわけないのですが、
例題の答えが
(1)$animal->walk(5, 2);
(2)$animal->walk(-10, 20);
(3)$animal->walk(2, 0);
(4)$animal->walk(-50, 21);
(5)$animal->walk(-11, -20);
(6)$animal->walk(20, 30);
(7)$animal->get_weight();
(8)$animal->get_posi();
       ↓
(1)walking... [5], [2]
(2)walking... [-10], [20]
(3)walking... [2], [0]
(4)walking... [-50], [21]
(5)I died...
(6)Weight... 5920 g
(7)Position... x : -53, y : 43  になります。

予想していた答えが
(1)と(2)は解答と同じ
(3)~(6)I died...
(7)Position... x : -5, y : 22   でした。

(1)の解き方は
function walk($x, $y){
if(!$this->soul){
return;
}
if($this->weight < $this->first_weight * 0.6){
$this->death();
return;
}
$this->x += $x; 5を代入
$this->y += $y; 2を代入 
echo "walking... [{$x}], [{$y}]<br />";
$this->weight -= 20; 6000-20=5980


ここ間違っている部分をどのように考えたらよいのか教えていただけませんでしょうか?
宜しくお願いします。

補足日時:2007/11/07 23:22
    • good
    • 0

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