質問: $gas; ・なぜここは「$gas」なのでしょうか。初期値100は入らないのですか? それとも100は最後から4行目で定義する、という理解ですか? ・$this->gasというのがこれ以降何回か出てきますが、 どういう感じで使っているのか教えてください。 クラス内ではプロパティにthisを使うことが義務付けられているという理解でしょうか。 〇最後の3行...$car->goToDrive();が繰り返されるのは処理を3回繰り返せという意味ですか? 以上、よろしくお願いいたします。
回答: まず最初に。 **ご自身で書かれたんですよね?** **自身で書いたコードを他人に説明させるのはプログラマーとしてありえません。** **もちろん実際のプログラマーでなくても、趣味でも初心者でも状況としてありえません。** 書籍丸写しならまずそう書いてください。 それか、書籍丸写しっぽいコードを「自分で書きました」って言わないでください。 分かってないなら分かっていないなりに、その分かっていないことを質問に含めるべきです。 * 質問するときのヒント:今置かれている状況を整理し、わかっている範囲とわからない範囲を明確にしましょう > > 2行目...staticとありますがどうしても必要ですか? > > ネットで調べましたら静的変数とありましたがどういうことかつかめません。 > > > public static はstaticと同義と思ってください。 staticで定義しているので $this->gasのようなアクセスはできません。 大量に下記のエラーが出るはず。 ``` PHP Notice: Accessing static property Car::$gas as non static in ~~.php on line XX ``` 下記のようなコードを書いてみると良いです。 ``` $car = new Car(100); echo $car->gas; echo Car::$gas; ``` 上のechoでエラーが出るはずです。**staticなので。** エラー表示はOnにしてますか? というか、実際に動かしてみていますか? 最低限、エラー表示はOnにしておきましょう。 ということで、「どうしても必要ですか?」 については**要件次第。** クラス外からインスタンス化せずに利用することがあればつければいいし、 インスタンス化必須なのであればつける必要はありません。 クラス外から利用せずに内部からだけ利用するのでしたらpublicでもstaticでもなくprivateでも良いです。 それぞれの利用シーンについては言語に限らずおおよそ同じなので 「アクセス修飾子 使い分け」のような感じで検索して、記事を読み漁って理解を深めてください。 理解を深めるとは、ただ記事を読んでフンフンうなづくのではなく**実装して動かして確かめること**です。 > > 〇4行目... $this->gas = $gas; > > ・なぜここは「$gas」なのでしょうか。初期値100は入らないのですか? > > > コンストラクタで引数$gasで受け取っているから。 初期値を何をもって初期値と言っているか分かりませんけど、 プログラムってただ書いただけじゃ何もないんですよね。 classをnewでインスタンス化する処理を動かして初めてそれぞれ連動するわけでして。 ここで初めて利用され、100と言う値がコンストラクタに渡されて ``` $car = new Car(100); ``` 受け取った値がCarクラスの$gasプロパティに設定されて ``` public function __construct($gas) { $this->gas = $gas; } ``` ようやく100が入った情報として扱えるようになります。 まあ、引数で受け取る値は言い値なので、別に$gasってしなくてもいいです。 ``` public function __construct($test) { $this->gas = $test; } ``` こんなでもいいです。名前は任意で構わない。 でも仰っているようにご自身で書かれたんですよね。 何も意味なくただ書いただけじゃ理解は深まりませんよ。 通常でしたら、ちゃんと値がきているかのデバッグのために下記のように1度はやってみますよ。 ``` public function __construct($gas) { echo $gas; $this->gas = $gas; echo $this->gas; } ``` ただ、今回はstaticにされているので**staticのままにしておきたいなら**こう。 ``` public function __construct($gas) { self::$gas = $gas; } ``` クラス内部で$gasにアクセスしているところは全てこうしなければなりません。 いやいやアロー演算子でアクセスしたいんだよって場合は、プロパティのアクセス修飾子をかえてください。 ``` public $gas; ``` 外部からアクセスさせないなら ``` private $gas; ``` ただ、明示的に初期化しておきたいので私ならこうします。 ``` private $gas = 0; ``` > > ・$this->gasというのがこれ以降何回か出てきますが、 > > どういう感じで使っているのか教えてください。 > > クラス内ではプロパティにthisを使うことが義務付けられているという理解でしょうか。 > > > 自身で書いたコードなのに「どういう感じで使っているか分からない」とはどういうことでしょうか。 逆に聞きたい。「このコードはどのような意図を以て書いたんですか?」 大前提として、他人に説明できないコードは書いてはいけません。 クラスを利用する上で$thisは自身および継承した親オブジェクトであることは少し調べれば出てきます。 PHPマニュアルをきちんと読みましょう。 知りたいことはここを読めばほとんど書いてあるはず。 > > 〇最後の3行...$car->goToDrive();が繰り返されるのは処理を3回繰り返せという意味ですか? > > > 自分で書いたならなぜ3回書いたんでしょうか。教えてください。 そういう要件があったんじゃないですか? 下記のような感じですかね? ``` 車に最初にガソリンを100入れます。 1回のドライブでガソリンを50使います。 ガソリンが50未満だった場合はドライブに行けません。 ドライブに行けなくなるまで実行してみましょう。 ``` さて、聞きます。 このコードを書く際に出た要件は何でしょうか? どのようなミニマムコードであっても何かの要件に基づいて実装され、実行されるものです。 前提は何ですか? **コードから考えるのではなく、要件から、その要件にそったコードを書くように心がけてください。** そうすれば必要なこと必要でないことが見えてきます。 蛇足: m6uさんが仰っているように「より現実に近い車の使い方」を目指した要件を追加して実装してみてください。 おそらくそれで見えてくるものが沢山あるはずです。 そのときには「こういう理由でこのように書きました」と他人に説明できるくらいになっているといいですね。 まあ最初の方に書いたかもしれませんが、他人に説明できないコードを書いてはいけませんよ。 書籍写しだろうとネットからのコピペだろうと、**自身のコードの全責任は押し並べて自身にあります。**