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

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

ただいまの
回答率

90.45%

  • PHP

    24625questions

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

  • HTML

    11919questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

php $this->をなぜこのコードに必要なのかが理解できないです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 148

Akaho

score 22

progateのPHP学習コース2をやっています。
今やっている課題は、料理注文サイトを作ることを目指しています。
注文したJUICE、COFFEE、CURRY、PASTAの4つの商品の個数と金額をだす、つまり今行なっている作業はformの中でそれらの情報を送信して、値を受け取り小計金額をだす作業です。
今回、理解できない部分のコードがあるので そのコードがなぜいるのかを教えて下さい。
詳細〜
上から2つ目のコードグループにある

コード
public function getTaxIncludedPrice() {
    return floor($this->price * 1.08);
  }
// getTotalPriceメソッドを定義してください
  public function getTotalPrice(){
    return $this->getTaxIncludedPrice()*$this->orderCount;
  }


ですが、これは正解のコードです。
自分はこのコードに到るまでにreturn getTaxIncludedPrice()*$this->orderCount;としていました。
public function getTaxIncludedPrice() {
の中に$this->priceが入っているから、改めて$thisー>を getTaxIncludedPrice()の頭に入れなくてもいいんでは?と考えています。書かないでやってみるとクリアできませんでした。かくべき理由が分からないので教えて下さい。

コード
<?php require_once('data.php') ?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Café 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="menu-wrapper container">
    <h1 class="logo">Café Progate</h1>
    <form method="post" action="confirm.php">
      <div class="menu-items">
        <?php foreach ($menus as $menu): ?>
          <div class="menu-item">
            <img src="<?php echo $menu->getImage() ?>" class="menu-item-image">
            <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3>
            <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p>
            <input type="text" value="0" name="<?php echo $menu->getName() ?>">
            <span></span>
          </div>
        <?php endforeach ?>
      </div>
      <input type="submit" value="注文する">
    </form>
  </div>
</body>
</html>
コード
<?php
class Menu {
  private $name;
  private $price;
  private $image;
  private $orderCount = 0;

  public function __construct($name, $price, $image) {
    $this->name = $name;
    $this->price = $price;
    $this->image = $image;
  }

  public function hello() {
    echo '私は'.$this->name.'です';
  }

  public function getName() {
    return $this->name;
  }

  public function getImage() {
    return $this->image;
  }

  public function getOrderCount() {
    return $this->orderCount;
  }

  public function setOrderCount($orderCount) {
    $this->orderCount = $orderCount;
  }

  public function getTaxIncludedPrice() {
    return floor($this->price * 1.08);
  }

  // getTotalPriceメソッドを定義してください
  public function getTotalPrice(){
    return $this->getTaxIncludedPrice()*$this->orderCount;
  }

}
?>
コード
<?php
require_once('menu.php');

$juice = new Menu('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png');
$coffee = new Menu('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png');
$curry = new Menu('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png');
$pasta = new Menu('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png');

$menus = array($juice, $coffee, $curry, $pasta);

?>
コード
<?php require_once('data.php') ?>

<!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="order-wrapper">
    <h2>注文内容確認</h2>
    <?php foreach ($menus as $menu): ?>
      <?php 
        $orderCount = $_POST[$menu->getName()];
        // $menuに対して、$orderCountを引数としてsetOrderCountメソッドを呼び出してください
        $menu->setOrderCount($orderCount);

      ?>
      <p class="order-amount">
        <?php echo $menu->getName() ?>
        x
        <?php echo $orderCount ?></p>
      <!-- $menuに対してgetTotalPriceメソッドを呼び出して、金額を表示してください -->
      <p class="order-price"><?php echo $menu->getTotalPrice() ?></p>
    <?php endforeach ?>
  </div>
</body>
</html>


イメージ説明
イメージ説明

追記
『クラスが持つ情報にアクセスする際には必ず「所属」を明示する必要があります』
『メソッドを呼ぶ場合は、常に$obj->method()の形式で書く必要があります。』
上記2つから、必ず、常に所属クラスを明示する必要があるんだなと分かった。
『所属クラスが明示されていない場合は、既に回答があるように何のクラスにも属していない関数を実行します。』
勉強になった。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+5

かくべき理由が分からないので教えて下さい。

PHPでは、function()のようにオブジェクトなしで書いたら、それはグローバルな関数を呼び出すという意味になります(C++など、「メソッドがある場合はメソッド優先」という言語もありますが、PHPはそうではありません)。メソッドを呼ぶ場合は、常に$obj->method()の形式で書く必要があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/13 14:52

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

    キャンセル

checkベストアンサー

+3

PHPマニュアル「クラスとオブジェクト」をざっとでも良いので読んで例示されているサンプルコードを手元で動かして確認してみてください。

オブジェクト指向の根幹部分にもなるのですが、
クラスが持つ情報にアクセスする際には必ず「所属」を明示する必要があります。
「どのクラスが持っている何(プロパティ・メソッド)」という形に。
静的なプロパティやメソッドでなければ{所属クラス}->{アクセスしたい情報}という風に書きます。

new でインスタンス化してアクセスする時もそうしますよね?

class hoge{
  public function hello(){
    echo "hello";
  }
}

$obj = new hoge;
$obj->hello();


上記のような場合、$objがhogeクラス(所属クラス)となって->(アロー演算子と言います)で情報にアクセスできるようになるわけです。

で、「自身のクラス)」から「自身のクラス、または親クラス」へアクセスしたい場合に「所属クラス」を現す表現が$thisになります。
所属クラスが明示されていない場合は、既に回答があるように何のクラスにも属していない関数を実行します。
※それがユーザー定義関数かPHPが元から持っている関数かはPHPは知りません。存在しない関数であれば未定義エラーを出力するだけとなります

なので、所属を明示するためにも$thisが必要になるわけです。

<?php
class hoge{
  private $word;
  public function say(){
    echo $this->getWord();
  }
  public function setWord($word="say"){
    $this->word = $word;
  }
  public function getWord(){
    return $this->word;
  }
}

$obj = new hoge;
$obj->setWord("hello");
$obj->say();
echo PHP_EOL;
echo $obj->getWord()." world";

下記のような質問とその回答も理解の助けになると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/13 15:18

    『PHPマニュアル「クラスとオブジェクト」をざっとでも良いので読んで例示されているサンプルコードを手元で動かして確認してみてください。』
    →ざっと現時点で理解できそうな部分は読んで見ました。
    ただ、例示されているサンプルコードは現時点では理解しづらいところがありました。
    そのサンプルコードの中でecho以外にもprintってのがあるんだなと、別の内容ですが勉強になりました。
    参照ありの解説ありがとうございました。

    キャンセル

  • 2019/06/13 15:27

    >→ざっと現時点で理解できそうな部分は読んで見ました。
    ただ、例示されているサンプルコードは現時点では理解しづらいところがありました。

    そのままで動いた・・・だけだと根本的な理解にはつながらないので
    自身でも色々追加したり編集したり削除したりして動かしてみると良いです。
    trial and error.

    >echo以外にもprintってのがあるんだな
    うーんそこからとなるともっと基礎的な部分を学んだほうがいいかもしれませんね。
    厳密には言語構造と関数という違いはありますが、結果は同じです。

    キャンセル

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

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

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

  • PHP

    24625questions

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

  • HTML

    11919questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。