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

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

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

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

Q&A

解決済

2回答

2000閲覧

require_onceで読み込んでいないファイルのメソッドは使えるのか。

kgn8

総合スコア5

PHP

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

0グッド

0クリップ

投稿2019/11/01 17:20

前提・実現したいこと

PHPを勉強し始めたプログラミング初心者です。
ProgateのPHP学習コース4をやっているのですが、下のmenu.phpのgetReviews()を定義しているところでrequire_onceで読み込んでいないreview.phpで定義したクラスのプロパティメソッドであるgetMenuName()が使用できているのですが、読み込んでいないファイルのメソッドがなぜ使えているのかわかりません。
実際にgetReviews()を使用しているshow.phpでだdata.php、ひいてはreview.phpを読み込んでいるから使えるという理解でよろしいのでしょうか?
どなたか教えていただけると幸いです。

発生している問題・エラーメッセージ

エラーは発生しておりません。

該当のソースコード

menu.php

<?php class Menu { protected $name; protected $price; protected $image; public function __construct($name, $price, $image) { $this->name = $name; $this->price = $price; $this->image = $image; } public function getName() { return $this->name; } // getReviewsメソッドを定義してください public function getReviews($reviews){ $reviewsForMenu = []; foreach($reviews as $review){ if($this->name == $review->getMenuName()){ $reviewsForMenu[] = $review; } } return $reviewsForMenu; } } ?>

review.php

<?php class Review { private $menuName; private $body; public function __construct($menuName, $body) { $this->menuName = $menuName; $this->body = $body; } public function getMenuName() { return $this->menuName; } public function getBody() { return $this->body; } }

data.php

<?php require_once('drink.php'); require_once('food.php'); require_once('review.php'); $juice = new Drink('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png', 'アイス'); $coffee = new Drink('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png', 'ホット'); $curry = new Food('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png', 3); $pasta = new Food('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png', 1); $menus = array($juice, $coffee, $curry, $pasta); $review1 = new Review($juice->getName(), '果肉たっぷりのオレンジジュースです!'); $review2 = new Review($curry->getName(), '具がゴロゴロしていてとてもおいしいです'); $review3 = new Review($coffee->getName(), '香りがいいです'); $review4 = new Review($pasta->getName(), 'ソースが絶品です。また食べたい。'); $review5 = new Review($juice->getName(), '普通のジュース'); $review6 = new Review($curry->getName(), '値段の割においしいカレーだと思いました'); $review7 = new Review($coffee->getName(), '苦味がちょうどよくて、おすすめです'); $review8 = new Review($pasta->getName(), '具材にこだわりを感じました。'); $reviews = array($review1, $review2, $review3, $review4, $review5, $review6, $review7, $review8); ?>

show.php

<?php require_once('menu.php'); require_once('data.php'); $menuName = $_GET['name']; $menu = Menu::findByName($menus, $menuName); // $menuに対して$reviewsを引数としてgetReviewsメソッドを呼び出して、戻り値を変数$menuReviewsに代入してください **$menuReviews = $menu->getReviews($reviews);** ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Progate</title> <link rel="stylesheet" type="text/css" href="stylesheet.css"> <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'> </head> <body> <div class="review-wrapper"> <div class="review-menu-item"> <img src="<?php echo $menu->getImage() ?>" class="menu-item-image"> <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> <?php if ($menu instanceof Drink): ?> <p class="menu-item-type"><?php echo $menu->getType() ?></p> <?php else: ?> <?php for ($i = 0; $i < $menu->getSpiciness(); $i++): ?> <img src="https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/chilli.png" class='icon-spiciness'> <?php endfor ?> <?php endif ?> <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?></p> </div> <div class="review-list-wrapper"> <div class="review-list"> <div class="review-list-title"> <img src="https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/review.png" class='icon-review'> <h4>レビュー一覧</h4> </div> <!-- $reviewsを$menuReviewsに書き換えてください --> <?php foreach($menuReviews as $review): ?> <div class="review-list-item"> <p><?php echo $review->getBody() ?></p> </div> <?php endforeach ?> </div> </div> <a href="index.php">← メニュー一覧へ</a> </div> </body> </html>

試したこと

Progateではこのコードでいいと言われました。

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

Progate PHP学習コースⅣ

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

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

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

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

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

guest

回答2

0

ベストアンサー

show.php の下記の部分

php

1<?php 2require_once('menu.php'); 3require_once('data.php'); 4 5$menuName = $_GET['name']; 6$menu = Menu::findByName($menus, $menuName); 7// $menuに対して$reviewsを引数としてgetReviewsメソッドを呼び出して、戻り値を変数$menuReviewsに代入してください 8**$menuReviews = $menu->getReviews($reviews);** 9 10?>

$reviews は data.php の中で定義されていますが、
Review クラスのインスタンスが配列になってますね。
で、Menu クラスの getReviews() では
そのインスタンスから関数 getMenuName() を使っている
という流れにみえます。

クラスからインスタンスを生成するには、クラスの定義が必要ですが
クラスから生成されたインスタンスのなにかを使う分には
クラスの定義は必要ではない、ということです。

投稿2019/11/01 22:28

takasima20

総合スコア7458

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

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

kgn8

2019/11/02 07:55

ありがとうございました。
guest

0

getReviews()を使用しているshow.phpでだdata.php、ひいてはreview.phpを読み込んでいるから使えるという理解でよろしいのでしょうか?

はい。

もっと簡単なコードで深い階層で試してみると良いです。
コードは基本的に上から順番に実行されるで、実行プログラムの冒頭で読み込んだ先に読みこみがあればそちらが取り込まれます。
ただ、読み込み順番は注意した方がいいケースもあります。(それはそのときに分かるかなと)

投稿2019/11/01 23:02

m.ts10806

総合スコア80850

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

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

kgn8

2019/11/02 07:56

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問