phpの基本を学んでみよう2（オブジェクト指向の基本）

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

https://www.youtube.com/channel/UCcXQG8lu_EdyP2Cbhtz1bcA



phpの基本を学んでみようシリーズ2
今回はオブジェクト指向-セッターまでです。

#著者略歴
名前：[YUUKI](https://twitter.com/bitcoinjpnnet)
ポートフォリオサイト：[Pooks](https://pooks.herokuapp.com)
現在：Webエンジニア見習い

##オブジェクト指向

- オブジェクト　＝　もの
- 指向　＝　〜を中心に

つまり、**ものを中心にした考え方**。

例えばECサイトを作るときは、
「商品」「ユーザー」「カート」などのそれぞれのオブジェクトを用意し、
各オブジェクトに応じたデータを入れ、それらを組み合わせて１つの「ECサイト」を作る、というような考え方。


プログラムでも、それぞれの役割に応じたプログラムをモジュール化し、組み合わせて１つのプロダクトを作る。

###クラス

- オブジェクトの設計図
- クラスを元に「オブジェクト」を作る
- class名は大文字にする（Menuとか）
書き方

```php
<?php

 class Menu{
  //ここに処理を書く
 }

?>
```

###インスタンス

- クラスを元に生成された実体
- クラス外に書く
- new クラス名()と書く
- 生成したインスタンスは変数に代入する

書き方

```php
<?php

 class Menu{
 }

 // インスタンスを生成する
 $menu1 = new Menu();

?>
```


###プロパティ

- インスタンスが持つデータ
- クラス内に定義する


書き方

```php
<?php

 class Menu{
  //プロパティを生成する
 public $name
 }

?>
```

####プロパティへのアクセス

```php
<?php

 class Menu{
  public $name;
 }

 $curry = new Menu();
 // プロパティにアクセスする
 $curry->name = 'CURRY';

?>
```

###メソッド

- インスタンスに関連する関数
- それぞれのインスタンスが持つ関数

使い方

```php
<?php

 class Menu{
  // メソッドの定義
  public function hello(){
   echo '私はMenuインスタンスです';
  }
 }

?>
```

####メソッドへのアクセス

```php
<?php

 $curry = new Menu;
 //　メソッドにアクセスする
 $curry->hello();

?>
```

###$this

- メソッド内で「インスタンスのプロパティ」や「メソッドにアクセスしたい」時に使う**特殊な変数**
- class内のメソッド内でのみ使用可
- メソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられる

書き方

```php:index.php
<?php
  class Menu{
    public $name;
    public function hello(){
      // $thisでプロパティ呼び出し
      echo '私の名前は'.$this->name.'です';
    }
  }
?>
```

```php:index.php
$curry = new Menu();
$curry->name = 'CURRY';
// メソッド出力
$curry->hello();
```

###コンストラクタ

- 定義するとnewを用いてインスタンスを生成した際に**自動的に呼ばれる**特別なメソッド

書き方

```php
<?php
  class Menu{
    // Menuクラスのインスタンス生成時に自動で呼ばれる
    public function __construct(){
      echo '１つのメニューが作成されました';
    }
  }
  
  // インスタンスを生成し、コンストラクタメソッドを呼びだす
  $curry = new Menu():
?>
```

####コンストラクタと引数

- __constructメソッドは引数を取れる
- newを用いてインスタンスを生成する際には、引数を与えられる
- 引数の値が__constructメソッドに渡される

####コンストラクタとプロパティ

- __constructメソッド内で、**$thisを用いてインスタンスのプロパティに値をセットできる**

書き方

```php
public function __construct($name){
  // 渡された引数の値をnameプロパティにセット
  $this->name = $name;
}
```

###HTMLにPHPを埋め込む

- phpのコードを埋め込むことで、「HTMLのコードとPHPのコード」を切り分けることができ、見やすくなる

書き方

```php

<p>
  <?php
    // pタグの中にphpコードを埋め込む
    echo $curry->name
  ?>
</p>
```

####foreach文をHTMLに埋め込む

- 「{」の代わりに:、「}」の代わりに「endforeach」と記述
- :とendforeachの中に処理を書く

書き方

```php
<?php
  $words = array('apple','banana','orange');
?>

<?php
  // {の代わりに:を使う
  foreach($words as $word):
?>
  <!-- phpタグ使用かつ1行なのでセミコロン不要/>
  <p><?php echo $word ?></p>

<?php
  // }の代わりにendforeachを使う
  endforeach
?>
```


###require_once

- require_onceを用いると、別のphpファイルを読み込むことができる
- require_onceで読み込んだファイルで定義されている「クラス」や「変数」を、require_onceを記述したファイル内で使用可能

例：
- menu.phpにMenuクラスを定義
- data.phpに変数を定義
- index.phpで変数の値を出力する

```php:menu.php
<?php

  class Menu{
    public name;
  }

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

?>
```

```php:data.php
<?php
  // menu.phpを読み込む
  require_once('menu.php')
  // Menuクラスを読み込んでるので、インスタンス生成が可
  $curry = new Menu('CURRY');
?>
```

```php:index.php
<?php
  // data.phpを読み込む
  require_once('data.php')
<p>
  // 
  <?php echo $curry->name ?>
</p>
?>
```

###画像を表示

- imageプロパティの値をsrc属性に指定するため、``の中に埋め込む
- echoを入れて出力結果を反映させる

例

```php
<img src="<?php echo $curry->image ?>" >
```

出力結果

```html
<img src="imageプロパティの値">
```

####floor

- 小数点以下を切り捨てる関数

```php
<?php
  public function getTaxIncludePlice(){
  // priceプロパティに1.08を掛け、小数点以下を切り捨てた値を返す
  return floor($this->price * 1.08);
}
?>
```

###カプセル化

- 使い手に必要ないものを隠してしまうこと
- パソコンを例にしたイメージ
  - 操作しても安全な部品だけを公開
  - 操作すると安全ではない部品は非公開（内部にアクセスできない）
- カプセル化の概念をクラス定義時に用いる
  - 共有する人に使って欲しい機能は公開
  - クラス外で使って欲しくない機能は隠す
    - 使える機能を制限することで、他の人はどの機能を使えばいいかが分かりやすく、安全にクラスを利用できる


####publicとprivate(カプセル化)

- カプセル化で「クラスのプロパティ」と「メソッド」へのアクセスを制限する
  - クラス外からアクセス→public
  - クラス外からアクセスできない→private
    -  プロパティは基本的にこちらを使う


###ゲッター

- プロパティの値を返すだけのメソッド
- 「getプロパティ」と命名する

使い方

```php
<?php
  class Menu{
    // プライベートプロパティの定義
    private $name;
    public function __construct($name){
      $this->name = $name;
    }

    public function getName(){
      // プロパティの値を返す
      return $this->name;
    }
  }
?>
```

###セッター

- プロパティの値を変更するメソッド
- 「setプロパティ名」と命名する

書き方

```menu.php
<?php
  class Menu{
    private $orderCount;
    public function setOrderCount($orderCount){
      $this->orderCount = $orderCount;
    }
  }

  $curry = new Menu('CURRY', ...);
  // セッターを用いて値をセット
  $curry->setOrderCount(3);

  echo $curry->getOrderCount();
  
  // privateの為、直接アクセスできない
  $curry->orderCount = 4;
?>
```

####プロパティは定義時に初期値をセットできる

```php
class Menu{
  private $orderCount = 0;
  public function getOrderCount(){
    return $this->orderCount;
  }
}
```