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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

4回答

569閲覧

PHP staticなどにつきまして

wpmanaby

総合スコア17

PHP

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

0グッド

0クリップ

投稿2018/07/02 23:36

編集2018/07/03 00:23

PHP

1コード
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回繰り返せという意味ですか?

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/03 00:12

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

2018/07/03 00:14 編集

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

2018/07/03 00:25

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

2018/07/03 00:26

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

回答4

0

〇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 00:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wpmanaby

2018/07/03 00:31

ありがとうございます!
退会済みユーザー

退会済みユーザー

2018/07/03 06:02

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

2018/07/03 06:59

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

0

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 00:25

編集2018/07/03 00:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wpmanaby

2018/07/03 00:58

ありがとうございます!
guest

0

ベストアンサー

まず最初に。

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

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

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

ネットで調べましたら静的変数とありましたがどういうことかつかめません。

public static はstaticと同義と思ってください。

staticで定義しているので $this->gasのようなアクセスはできません。
大量に下記のエラーが出るはず。

PHP Notice: Accessing static property Car::$gas as non static in ~~.php on line XX

下記のようなコードを書いてみると良いです。

php

1$car = new Car(100); 2echo $car->gas; 3echo Car::$gas;

上のechoでエラーが出るはずです。staticなので。

エラー表示はOnにしてますか?
というか、実際に動かしてみていますか?
最低限、エラー表示はOnにしておきましょう。

ということで、「どうしても必要ですか?」
については要件次第。
クラス外からインスタンス化せずに利用することがあればつければいいし、
インスタンス化必須なのであればつける必要はありません。
クラス外から利用せずに内部からだけ利用するのでしたらpublicでもstaticでもなくprivateでも良いです。

それぞれの利用シーンについては言語に限らずおおよそ同じなので
「アクセス修飾子 使い分け」のような感じで検索して、記事を読み漁って理解を深めてください。
理解を深めるとは、ただ記事を読んでフンフンうなづくのではなく実装して動かして確かめることです。

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

・なぜここは「$gas」なのでしょうか。初期値100は入らないのですか?

コンストラクタで引数$gasで受け取っているから。
初期値を何をもって初期値と言っているか分かりませんけど、
プログラムってただ書いただけじゃ何もないんですよね。
classをnewでインスタンス化する処理を動かして初めてそれぞれ連動するわけでして。

ここで初めて利用され、100と言う値がコンストラクタに渡されて

php

1$car = new Car(100);

受け取った値がCarクラスの$gasプロパティに設定されて

php

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

ようやく100が入った情報として扱えるようになります。

まあ、引数で受け取る値は言い値なので、別に$gasってしなくてもいいです。

php

1 public function __construct($test) { 2 $this->gas = $test; 3 }

こんなでもいいです。名前は任意で構わない。

でも仰っているようにご自身で書かれたんですよね。
何も意味なくただ書いただけじゃ理解は深まりませんよ。

通常でしたら、ちゃんと値がきているかのデバッグのために下記のように1度はやってみますよ。

php

1 public function __construct($gas) { 2 echo $gas; 3 $this->gas = $gas; 4 echo $this->gas; 5 }

ただ、今回はstaticにされているのでstaticのままにしておきたいならこう。

php

1 public function __construct($gas) { 2 self::$gas = $gas; 3 }

クラス内部で$gasにアクセスしているところは全てこうしなければなりません。

いやいやアロー演算子でアクセスしたいんだよって場合は、プロパティのアクセス修飾子をかえてください。

php

1public $gas;

外部からアクセスさせないなら

php

1private $gas;

ただ、明示的に初期化しておきたいので私ならこうします。

php

1private $gas = 0;

・$this->gasというのがこれ以降何回か出てきますが、

どういう感じで使っているのか教えてください。
クラス内ではプロパティにthisを使うことが義務付けられているという理解でしょうか。

自身で書いたコードなのに「どういう感じで使っているか分からない」とはどういうことでしょうか。
逆に聞きたい。「このコードはどのような意図を以て書いたんですか?」

大前提として、他人に説明できないコードは書いてはいけません。
クラスを利用する上で$thisは自身および継承した親オブジェクトであることは少し調べれば出てきます。

PHPマニュアルをきちんと読みましょう。
知りたいことはここを読めばほとんど書いてあるはず。

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

自分で書いたならなぜ3回書いたんでしょうか。教えてください。
そういう要件があったんじゃないですか?

下記のような感じですかね?

車に最初にガソリンを100入れます。 1回のドライブでガソリンを50使います。 ガソリンが50未満だった場合はドライブに行けません。 ドライブに行けなくなるまで実行してみましょう。

さて、聞きます。

このコードを書く際に出た要件は何でしょうか?
どのようなミニマムコードであっても何かの要件に基づいて実装され、実行されるものです。
前提は何ですか?

コードから考えるのではなく、要件から、その要件にそったコードを書くように心がけてください。
そうすれば必要なこと必要でないことが見えてきます。

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

投稿2018/07/03 01:15

編集2018/07/03 01:22
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wpmanaby

2018/07/03 01:21

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

2018/07/03 01:22

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

2018/07/03 01:46

かしこまりました。
guest

0

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 00:14

trewa-nek9585

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/03 00:24

横から失礼します。 > しかし繰り返し実行の場合にはfor文を使用してください。 「ガソリン100Lをセット」 「ドライブ1回に50Lを利用する」という条件ですが、 現実的に考えて50Lも使うドライブを単に連続するのも変なのでforなどで繰り返し実行するかどうかは 要件次第だと思います。 とはいえ、staticつけてるのでクラス内部からのアクセス方法がおかしいので、このコードエラーでますけどね。。。
trewa-nek9585

2018/07/03 00:28

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

2018/07/03 00:33 編集

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

2018/07/03 00:59

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問