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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

1回答

1316閲覧

PHPオブジェクト指向において、methodの引数を型指定で出力できた結果を、クラス継承を用いて同様に実現したい。

yoshitaro

総合スコア1

PHP

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2020/10/25 03:06

前提・実現したいこと

PHPオブジェクト指向において、methodの引数を型指定で可能なことをクラス継承を用いて実現したいのですが出来ません。

お世話になっております。
PHPのオブジェクト指向の学習を初めたばかりです。非常に初歩的な質問で申し訳有りません。
どうしても解決できなくて困っております。諸兄の皆様にご教授頂きたいと思います。宜しくお願いいたします。

以下の出力結果を得たいのですが


たまさんの入場料金は 0 円です。
ゆたぼんさんの入場料金は 400 円です。
あじーさんの入場料金は 800 円です。
ぎんさんの入場料金は 500 円です。


下記のコードでは以下の出力となってしまいます。


さんの入場料金は 円です。
さんの入場料金は 円です。
さんの入場料金は 円です。
さんの入場料金は 円です。


該当のソースコード

PHP

1class Human 2{ 3 protected $name; 4 protected $age; 5 6 function __construct($name, $age) { 7 $this->name = $name; 8 $this->age = $age; 9 } 10} 11 12class Zoo extends Human { 13 protected $zoo_name; 14 protected $age_price; 15 16 function __construct($zoo_name, $age_price) { 17 parent:: __construct($name, $age); 18 $this->$zoo_name; 19 $this->$age_price; 20 } 21 22 function info_entry_fee() { 23 if($this->age <= 5){ 24 print($this->name."さんの入場料金は ".$this->age_price["infant"]." 円です。"."\n"); 25 }elseif($this->age <= 12){ 26 print($this->name."さんの入場料金は ".$this->age_price["children"]." 円です。"."\n"); 27 }elseif($this->age <= 64){ 28 print($this->name."さんの入場料金は ".$this->age_price["adult"]." 円です。"."\n"); 29 }elseif($this->age <= 120){ 30 print($this->name."さんの入場料金は ".$this->age_price["senior"]." 円です。"."\n"); 31 } 32 } 33} 34 35$zoo = new Zoo("旭山動物園",[ "infant" => 0, "children" => 400, "adult" => 800, "senior" => 500]); 36 37$human1 = new Human("たま",3); 38$human2 = new Human("ゆたぼん",10); 39$human3 = new Human("あじー",32); 40$human4 = new Human("ぎん",108); 41 42$humans = [ $human1, $human2, $human3, $human4 ]; 43 44foreach($humans as $human){ 45 $zoo->info_entry_fee($human); 46}

補足情報(FW/ツールのバージョンなど)

MacOS PHP7.3.11

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

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

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

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

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

hentaiman

2020/10/25 06:36

デバッグせずにノーエラーでそれだけのコード書いたんですか?
yuki23

2020/10/25 07:18

継承を使うのは間違いだと思いますが、なぜ継承を使う必要があるんでしょうか?
yoshitaro

2020/10/25 08:16

@hentaimanさん いえ、行いながらですがこちらのコードでエラーは出ておりませんので記述しませんでした。 何か載せたほうが良かったでしょうか?不慣れで申し訳有りません。 @yuki23さん 役割と責任が違うので継承は不適切かと思いましたが、何故かと言われますとやってみたかっただけになります。後学の為に試してみたのです。宜しくお願いいたします。
yuki23

2020/10/25 08:43

できないとわかってやってみたら、やっぱりできなかったということですか? その通り、できません。としか答えようがないです。
yoshitaro

2020/10/25 08:47

いえ、出来ないとは思っておりません。不適切でも出来るならやってみたいと思っただけです。 単一責任の原則とはずれていると認識はしているということです。 何故出来ないのでしょうか?申し訳ないのですが教えて頂けないでしょうか? ヒントとなる検索コードでも知りたいです。調べてもわからないのです。
hentaiman

2020/10/25 10:10

> いえ、行いながらですがこちらのコードでエラーは出ておりませんので記述しませんでした。 > 何か載せたほうが良かったでしょうか?不慣れで申し訳有りません。 そういう訳では無いですが、デバッグしながらここまで作れたならさらにデバッグ(値を確認)しながらやればバグ修正出来るので、いったいどんな作り方をしたのか?と思い気になりまして。
guest

回答1

0

ベストアンサー

extendsは文字通り拡張なので、使い方、使う目的が違います。
分かりやすく質問者のコードに合わせて言うと「人間」は拡張しても「動物園」には変わりません。
例えば「人間」を拡張して「日本人」にする事はあるでしょう

class Human{ //省略 } class Japanese extends Human{ //省略 }

もしも「動物園」と「人間」で考えるなら、extendsではなくzooの中にhumanが何人いるか、みたいな考え方でしょう

class Human{ private $age private $sex private $name //省略 } class Zoo {//extendsはしない private $staff; public function setPeaples($humans){ $this->$staff= $humans } //省略 }

質問に記載されているコードそのままでやりたいなら、使っている変数を都度echoして何が起きてるか確認しましょう

投稿2020/10/25 10:25

hentaiman

総合スコア6426

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

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

退会済みユーザー

退会済みユーザー

2020/10/25 11:16

Humanを拡張してZooを作る意味がまったく伝わってこない。 目的や期待する動作が全く異なる者同士を関係付けるのがナンセンス。 ってなことで、この回答を支持。
yoshitaro

2020/10/25 15:10

@hentaimanさん 丁寧に回答して頂きありがとうございます。セッターゲッターの理解も甘いので提示して頂いた方法で両方やってみたいと思います。 有難うございました。
yoshitaro

2020/10/25 15:15

@m6uさん あなたが想定する意味など有りません。求めてません。今の私のレベルで見たいものと、あなたのレベルで見るべきものが同じであるわけがありません。後学のためにやりたかった書いています。継承のメカニズムを理解したかったとも。あなたが言っている意味など解った上で書いてます。 どうしてある程度の歴と実力を付けると人は目下の人間に肯定と否定の二択しか持てなくなるんでしょうか?それも否定に傾きがちです。ヘビーユーザーのライトユーザー潰しには辟易です。学び始めた人にマウントするのはやめてください。不快です。 そのコメントであなたになんの得がるんですか?誰のためですか?初学者に偉そうにして何が満たされるんですか??薄っぺらい承認欲求ですか?くだらないと思いませんか? もう次はしないようにして下さい。
hentaiman

2020/10/25 15:31

今回の場合はセッターゲッターあってもなくてもどうでも良いですが、一例として、地図系のAPIから店舗情報を取得する処理を含むクラスの場合だと、レスポンスをprivateに入れる事と変数へのアクセス(取得)をゲッターに限定する事で、レスポンス(店舗情報)の改変が無い事が保証されますね。 複数人で開発してクラスを他者に利用してもらいたい時などには必須の考え方です。 質問文のコードに関しては処理を追ってechoで変数の内容確認しながら作れば直せると思うので、他のアドバイスはありません。凡ミスはよくあるけどちょっと良いエディタを使うなど、対策は様々あるでしょう。
yoshitaro

2020/10/25 16:25

@hentaimanさん 重ね重ね丁寧な返信ありがとうございます…。 実例まで示して頂けるとは…感謝申し上げます。 御厚意を励みにして完成させたいと思います。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問