質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • PHP

    21275questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHP staticなどにつきまして

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 239

wpmanaby

score 10

コード
class Car {
 public static $gas;
 public function __construct($gas) {
 $this->gas = $gas;
 }
 public function goToDrive() {
 if(50 <= $this->gas) {
 echo "ドライブに⾏きました。<br>";
 $this->gas = $this->gas - 50;
 } else {
 echo "ガソリンが⾜りないのでドライブに⾏けませんでした。<br>";
 }
 }
}
$car = new Car(100);
$car->goToDrive();
$car->goToDrive();
$car->goToDrive();

〇2行目…staticとありますがどうしても必要ですか?
ネットで調べましたら静的変数とありましたがどういうことかつかめません。

〇4行目… $this->gas = $gas;
・なぜここは「$gas」なのでしょうか。初期値100は入らないのですか?
それとも100は最後から4行目で定義する、という理解ですか?

・$this->gasというのがこれ以降何回か出てきますが、
どういう感じで使っているのか教えてください。
クラス内ではプロパティにthisを使うことが義務付けられているという理解でしょうか。

〇最後の3行…$car->goToDrive();が繰り返されるのは処理を3回繰り返せという意味ですか?

以上、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/07/03 09:12

    コード部分がはみ出ているのでおさめてください。 「コード」の部分をソースコードに置き換えればOKです。

    キャンセル

  • mts10806

    2018/07/03 09:14 編集

    ところで他人のコードを見ているかのような表現がありますが、自身で書いたコードではないのでしょうか。

    キャンセル

  • mts10806

    2018/07/03 09:25

    回答のコメントに書きましたが、このコードはエラーが出ます。まず実行した上で提示してください。

    キャンセル

  • wpmanaby

    2018/07/03 09:26

    修正いたしました。私が書いたコードですが、他の方に質問した文をそのまま掲載しています。

    キャンセル

回答 4

+2

2行目…staticとありますがどうしても必要ですか?
ネットで調べましたら静的変数とありましたがどういうことかつかめません。

むしろいらない。あるとまともに動かないはず。

4行目… $this->gas = $gas;
・なぜここは「$gas」なのでしょうか。初期値100は入らないのですか?
それとも100は最後から4行目で定義する、という理解ですか?

最後から4行目の引数を $gas としています。
public function __construct($tmp) {
$this->gas = $tmp;
とかやってみるとわかるかと。

・$this->gasというのがこれ以降何回か出てきますが、
どういう感じで使っているのか教えてください。
クラス内ではプロパティにthisを使うことが義務付けられているという理解でしょうか。

$thisというのは、オブジェクトを自身を指す特別な変数です。が、ちょっとわかりにくいとは思います。

最後の3行…$car->goToDrive();が繰り返されるのは処理を3回繰り返せという意味ですか? 

そうです。

全体として、理解されていないようなので、マニュアルをちゃんと読むとよいかと。
クラスとオブジェクト

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 09:58

    ありがとうございます!

    キャンセル

+2

〇2行目…staticとありますがどうしても必要ですか?

調べ方が甘い。
PHP: static キーワード - Manual

static プロパティは、矢印演算子 -> によりオブジェクトからアクセス することはできません。

ってなってて、じゃぁどういう違いがあるのかというのを検証した記事が
PHPの静的変数 (static変数) の挙動まとめ - Qiita

--

〇4行目… $this->gas = $gas;

public function __construct($gas) {
としてコンストラクタの引数に$gasが定義されているので、
$car = new Car(100);とした場合の100が$gasに代入されているのですが。
それを$this->gas = $gas;でプロパティgasに代入しようとしているように見えます。

クラス内のメンバ変数にアクセスするのに、
$this->を書かないと単に(メソッド内の)ローカル変数を参照すると捉えられるので、
メンバ変数にアクセスすることを明示するための記法です。

ただし、先のstatic宣言しているプロパティには、->が使えないし、
変動するガソリン量を管理する目的にはstatic宣言はかえって邪魔なので、
通常のプロパティに変更するのが妥当と考えます。

<?php

class Car {
    public $gas;

    public function __construct($gas) {
        $this->gas = $gas;
    }

    public function goToDrive() {
        if(50 <= $this->gas) {
            echo "ドライブに⾏きました。<br>";
            $this->gas = $this->gas - 50;
        } else {
            echo "ガソリンが⾜りないのでドライブに⾏けませんでした。<br>";
        }
    }
}
$car = new Car(100);
$car->goToDrive();
$car->goToDrive();
$car->goToDrive(); 

--

〇最後の3行…$car->goToDrive();が繰り返されるのは処理を3回繰り返せという意味ですか? 

ドライブに3回行こうとするから、3回呼び出しているのではないでしょうか。

理屈として、
ドライブに行ったら必ず50減るというのはちょっと納得行かないところもありますね。
もしかしたら、特定のお気に入りの場所まで行って帰ってくるだけのドライブなのかもしれませんが。

クラスやオブジェクトの理解を深めるために、
例えばgoToDriveメソッドの引数にキロ数を与えて、
それに応じたガスの減算をするとか、
給油のメソッド(例えばvisitGS())とか定義を足して
満タン給油なのか10リットルだけなのかとか対応できるようにするとか、
いじくるのも一興かと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 09:31

    ありがとうございます!

    キャンセル

  • 2018/07/03 15:02

    そのコメントは、ちゃんと意図が伝わったと捉えていいのか、それとも反射的に思慮なしに発しているのか。ま、どうでもいいですけど。

    キャンセル

  • 2018/07/03 15:59

    分かりやすい説明でよく理解できました!

    キャンセル

checkベストアンサー

+1

まず最初に。

ご自身で書かれたんですよね?
自身で書いたコードを他人に説明させるのはプログラマーとしてありえません。
もちろん実際のプログラマーでなくても、趣味でも初心者でも状況としてありえません。

書籍丸写しならまずそう書いてください。
それか、書籍丸写しっぽいコードを「自分で書きました」って言わないでください。
分かってないなら分かっていないなりに、その分かっていないことを質問に含めるべきです。

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さんが仰っているように「より現実に近い車の使い方」を目指した要件を追加して実装してみてください。
おそらくそれで見えてくるものが沢山あるはずです。
そのときには「こういう理由でこのように書きました」と他人に説明できるくらいになっているといいですね。
まあ最初の方に書いたかもしれませんが、他人に説明できないコードを書いてはいけませんよ。
書籍写しだろうとネットからのコピペだろうと、自身のコードの全責任は押し並べて自身にあります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 10:21

    大変失礼いたしました。
    ありがとうございます!

    キャンセル

  • 2018/07/03 10:22

    蛇足も含めて読んでおいてください。

    キャンセル

  • 2018/07/03 10:46

    かしこまりました。

    キャンセル

+1

static、静的とはクラスをインスタンス化しなくてもアクセスできるようにするワードです。
インスタンス化とはCarクラスをオブジェクトとして実体化することで、よく言われるのがCarクラスという設計図からCarオブジェクトという実際のCarを作り出すことです。
つまりstaticなプロパティ、メソッドは設計図の段階のCarから利用できるということです。
実際のコードではnew Car の箇所がインスタンス化ですね。$gasは引数と呼ばれるもので、new Car(100)の100がこれに当たります。なので__constructor内の$gasは上では100ですが、new Car(200)とすれば200となる動的なものです。Class内で$thisを使った場合、$thisはクラスオブジェクト自身を指します。つまり$thisを通せばオブジェクト自身のプロパティやメソッドには全てアクセスできます。
$gasはおそらくガソリンのことで、ガソリンは車毎に所持しているプロパティだと思うので、public staticなプロパティになっている意味がよくわからないのです。その行自体が要らない気がしますね。
$car->goToDrive()は3行書いたら、3回実行することになりますね。しかし繰り返し実行の場合にはfor文を使用してください。
こんなとこでしょうか
こういう基本的なことは公式ドキュメントが一番詳しいので、最初は辛いかもしれませんがそっちをみた方が長い目でみたらいいです。一応貼っときます。
http://php.net/manual/ja/language.oop5.static.php

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 09:24

    横から失礼します。
    > しかし繰り返し実行の場合にはfor文を使用してください。

    「ガソリン100Lをセット」
    「ドライブ1回に50Lを利用する」という条件ですが、
    現実的に考えて50Lも使うドライブを単に連続するのも変なのでforなどで繰り返し実行するかどうかは
    要件次第だと思います。

    とはいえ、staticつけてるのでクラス内部からのアクセス方法がおかしいので、このコードエラーでますけどね。。。

    キャンセル

  • 2018/07/03 09:28

    現実的に考えて50Lも使うドライブを>単に連続するのも変なのでforなどで繰り返し実行するかどうかは
    要件次第だと思います。
    確かにそうですね。ご指摘ありがとうございます。

    なんでstaticつけたんですかね。

    キャンセル

  • 2018/07/03 09:31 編集

    とりあえずつけとけみたいな感じは最初はありますね。
    定義すること自体は文法的に問題ないですが、意図を以てつけるべきものだと思います。
    いやむしろどっちかに寄せないとですね。今回の場合はpublic いやprivateでもいい気がします。

    キャンセル

  • 2018/07/03 09:59

    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21275questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。