20日目。Progate PHPⅢ…お料理サイトをリニューアル!


20日目の今日は、オブジェクトとかクラスとか継承とか、新用語がたくさん出てきて大混乱です!
イメージがつかみにくくてあちこち調べてみましたが、なかなかピンときません。メソッドとかコンストラクタとかね・・・今聞かれてもこれですって答えられない感じです。

ともかくなんとかエイヤーで分からないけどクリアしました。そのうち分かることを期待して完成です!(所要時間 1時間半)

お料理サイト Ver2
http://appdays.herokuapp.com/Day20/

クラスプロパティ

クラスのプロパティ
プロパティは変数のこと。「属性」「フィールド」と呼ぶ人もいる。
http://php.net/manual/ja/language.oop5.properties.php
クラスプロパティは「static」を用いて定義する。
クラスプロパティにアクセスする場合は「クラス名::$クラスプロパティ名」

<?php
      class Menu {
      public static $プロパティ名 = 5;  // 初期値を指定できる。省略可。
    }   
?>

//値を表示
  <?php echo Menu::$count; ?>

コンストラクタ

コンストラクタ(構築子[1]、英: constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数あるいはメソッドのことである。対義語はデストラクタ。
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF

Self

クラス内でクラスプロパティにアクセスする際は「self」という特殊な変数を用います。
selfは、クラスの中で使うとそのクラス自身のことを指し示し、「self::$クラスプロパティ名」のように使います($の位置に気をつけてください)。

<?php
  class Menu {
    private static $プロパティ名;

    // クラスメソッドは以下のように「static」を用いて定義します
    public static function クラスメソッド名() { 

      // クラス内ではselfを用いることでクラスプロパティにアクセスできます
    return self::$プロパティ名;

    }
  }

  // 以下のようにしてクラスメソッドを呼び出すことができます
  Menu::クラスメソッド名();

  ?>

継承

継承とは、既に存在するあるクラスを元に、それを更に拡張したクラスを作る仕組みです。
ほとんど似ているけど、ちょっとだけ違うクラス、とかそういうのを作るのに適しています。
http://www.objective-php.net/basic/extend
→なるほど!

   <?php
  class Menu {
    public function hello() {
      echo 'hello';
    }
  }

   // extendsを用いるとクラスを継承できます。
  class Drink extends Menu {

  }

  $drink = new Drink();
  // 子クラスのインスタンスは親クラスのメソッドを使えます
  $drink->hello();
  // 結果: hello
  ?>

独自メソッド、プロパティ

   <?php
  class Menu {
    public function hello() {
      echo 'this is a menu';
    }
  }


  class Drink extends Menu {
    // 子クラス独自のプロパティを定義できます
    private $type;

    // 子クラス独自のメソッドを定義できます
    public function getType() {
      return $this->type;
    }
  }

  $drink = new Drink();
  $drink->getType();

  // 親クラス(Menuクラス)のインスタンスは、子クラス(Drinkクラス)のメソッドを呼び出すことができません。

instanceof

ある変数が、調べたいクラスの仲間かどうか確認する関数。

   <?php
  class Food extends Menu {
  }

  class Drink extends Menu {

  }

  $drink = new Drink();

  ?>

  <?php if ($drink instanceof Drink): ?>
    <!-- ここは実行されます -->
  <?php endif ?>

  <?php if ($drink instanceof Food): ?>
    <!-- ここは実行されません -->
  <?php endif ?>

protected

  <?php
  class Menu {
    private $name; // 子クラスからアクセスできない
    protected $image; // 子クラスからアクセスできる

    public function hello() {
      echo 'this is a menu';
    }
  }


  class Drink extends Menu {
    // 子クラスでは親クラスのメソッドを上書きできます(オーバーライド)
    public function hello() {
      echo 'this is a drink';
    }

    public function showImage() {
      // imageプロパティはprotectedなので、子クラスからアクセスできます
      echo $this->image;
    }
  }

parent

parentキーワードで親クラスの要素を呼び出せる。
(どうしてこういう回りくどい事になっているんだろう?ストレートに呼び出せなくしている理由があるんだろうか?)

   <?php
  class Menu {
    public function hello() {
      echo 'this is a menu.';
    }
  }


  class Drink extends Menu {
    public function hello() {
      // parentを用いると、親クラスのメソッドを呼び出すことができます
      parent::hello();
      echo 'this is a drink.';
    }
  }

  $drink = new Drink();
  $drink->hello();
  // 結果 => this is a menu. this is a drink.

  ?>

HTMLの中でForループを使う

  spicinessプロパティの数だけ繰り返し処理を行う方法

  <?php for ($i=0; $i<$menu->getSpiciness(); $i++): ?>

  <?php endfor ?>