PHP基本集(2)~クラス~

自分の学習用です:santa_tone1:

###クラスの定義方法
クラスとは、簡単にいうと設計図のようなもの。
オブジェクト指向（簡単に言うと現実世界の物に例える様にプログラムを組む思考）に倣って作成していく。

[オブジェクト指向（PHP）](https://qiita.com/ki-ra-co/items/85cfe773a2f85d4984c9)

漫画『ONE PIECE』の世界で例えるとすれば、海賊船のクラス（設計図）があったとする。

```php
<?php
  class PirateShip {  //クラス名の頭文字は大文字にする
    //クラスの内容
  }
?>
```

###インスタンス
インスタンスとは、クラスを元に実際に具現化した実体である。
設計図を元に造船したようなものである。
インスタンスを生成する際は、「**$インスタンス名 = new クラス名( )**」と記述する。

```php
<?php
  class PirateShip {  //海賊船の設計図
    
  }
  
  $goingMerry = new PirateShip();   //ゴーイング・メリー号を造船
  $mobyDick = new PirateShip();     //モビー・ディック号を造船
  $arkMaxim = new PirateShip();     //方舟マキシムを造船
?>
```

###クラスのプロパティ
プロパティとはクラスが持つデータのことである。
**キー（データのタイトル）**と**値（データ内容）**で組み合わせられている。
クラスにプロパティのキーを定義することで、各インスタンスによってデータ内容を変えていくことが出来る。

```php
  <?php
  class PirateShip {  //海賊船の設計図
    public $captain;  //船長プロパティの定義。
  }
  //インスタンスの生成
  $goingMerry = new PirateShip();   //ゴーイング・メリー号を造船
  $mobyDick = new PirateShip();     //モビー・ディック号を造船
  $arkMaxim = new PirateShip();     //方舟マキシムを造船
  //プロパティの値を定義
  $goingMerry->captain = 'luffy';   //船長はルフィ
  $mobyDick->captain = 'newgate';   //船長は白ひげ
  $arkMaxim->captain = 'enel';      //船長はエネル
```
各インスタンスのプロパティ値にアクセスする時は「**$インスタンス名->プロパティ名**」とする。

```php
<?php echo $goingMerry->captain; //「luffy」が出力される　?>
```

###クラスのメソッド
メソッドは一連の処理を一纏めにしたものである。
同じクラスの中で、プロパティやメソッドにアクセスするときは「**$this**」を使用出来る。

```php
<?php 
  class PirateShip {  //海賊船の設計図
    public $captain;  //船長プロパティ。
    public function introduction() { //船の船長名を出力するメソッドを定義
      echo 'この海賊船の船長は'.$this->captain.'です'; 
    }
  }
?>
```
各インスタンスのメソッドを呼び出す時は「**$インスタンス名->メソッド名**」とする。

```php
<?php $goingMerry->introduction; //出力結果：この海賊船の船長はluffyです　?> 
```

###コンストラクタ
「**__construct**」というメソッドを使用すると、newを用いてインスタンスを生成した時点で自動的にメソッドを呼び出すことが出来る。

```php
<?php 
  class PirateShip {  //海賊船の設計図
    public $captain;  //船長プロパティ。
    public function __construct() { 
      //インスタンス生成時に自動的に船の種類を出力する処理が行われる
      echo 'これは海賊船です'; 
    }
  }
?>
```
例えば、プロパティの値を定義していなくても、上記コンストラクタに引数を渡せば、引数を利用して自動的にプロパティ値をセットすることも出来る。

```php
<?php 
  class PirateShip {  //海賊船の設計図
    public $captain;  //船長プロパティ。
    public function __construct($captain) { //仮引数で値（luffy）を受け取る  
      $this->captain = $captain; //インスタンス生成時に自動的にcaptainデータに値をセット
    }
  }

  $goingMerry = new PirateShip('luffy'); //テータにセットする値（luffy）を引数で渡す

?>
```
###HTMLにPHPを埋め込む

```php
<?php 
  class PirateShip {  //海賊船の設計図
    public $captain;  //船長プロパティ。
    public function __construct($captain) { //仮引数で値（luffy）を受け取る  
      $this->captain = $captain; //インスタンス生成時に自動的にcaptainデータに値をセット
    }
  }
  $goingMerry = new PirateShip('luffy'); //テータにセットする値（luffy）を引数で渡す
?>

<p>船長は<?php echo $goingMerry->captain ?>である<p>  
```

###条件分岐や繰り返し処理を埋め込む

**foreach文を使用する場合**
『 **{** 』の代わりに『 **:** 』を使用し、『 **}** 』の代わりに『 **endforeach** 』と記述する。

```php
<?php 
  $captains = ['luffy', 'newgate', 'enel'] //配列作成
?>

<h1>参加する船長名<h1>

<?php foreach($captains as $captain): ?>
  <p><?php echo $captain ?></p>
<?php endforeach ?>
```
これでpタグの部分には、配列に入れられた船長３名分の名前が繰り返し表示される。

foreach文の他にも、if文やfor文、while文、switch文でも上記と同様の記述をしていく。

```php
<?php if($age >= 20): ?>
  内容
<?php endif ?>

<?php for($i = 0; $i < 100; $i++): ?>
  内容
<?php endfor ?>

<?php while($i < 50): ?>
  内容
<?php endwhile ?>
```
###ファイルを分割する
ただし、上記の記述のようにPHPとHTMLのコードを織り交ぜていくと複雑で見辛くなるので、
その場合はクラス定義用のファイル、データ定義用のファイル、表示用のファイルに分けるなどして、ファイルを分割していく。
「**require_once ( ' 読み込みたいファイル名 ' )**」を使用して読み込むことで、別ファイルに定義したクラスやメソッド、処理内容を反映することができる。

```index.php
<?php require_once('one_piece.php') ?>

<p><?php echo $goingMerry->introduction ?></p>
```