PHP/Laravelの書き方の基本ルールまとめる(PHPフレームワークLaravel入門に入る前に）part3

#クラスとインスタンスについて

##クラスとインスタンスとは
PHPには原本となる型を再利用して効率化を測る機能があります。それがクラスとインスタンスです。
クラスが原本となる型。
インスタンスが型を元にして作成されたものです。
型の中身には、**メソッド**と**プロパティ**という要素が存在しています。
メソッドが**機能**(関数や制御構造など)
プロバティが**データ**(名前や性別といった属性)になります。
以前まとめたものが[こちら](https://qiita.com/bk150125/items/d016c274df8eaa6dd759)になりますので参照ください。
##クラス定義
###覚えること
クラス定義方法
インスタンス作り方
値のアクセス方法
値の入れ方
メソッドの実行方法
コンストラクタ
クラス定義ファイルの読み込み
スタティックプロパティとスタティックメソッド


まずはこいつら
・クラス定義方法
・インスタンス作り方
・値のアクセス方法
・値の入れ方
・メソッドの実行方法
```記述例.php
<?php

class staff {
  //インスタンスのプロパティ
  public $name;
  public $age;
  //インスタンスのメソッド
  public fanction hello(){
    echo  "こんにちは","\n";
  }
}
?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>クラスを定義する</title>
</head>
<body>
<pre>
<?php
  //Staffのインスタンスを作る
  $hana = new Staff();
  $taro = new Staff();
  //プロパティの値を設定する
  $hana->name = "花";
  $hana->age = "21";
  $taro->name = "太郎";
  $taro->age = "35";
  //インスタンスを確認する
  print_r($hana);
  print_r($taro);
  //メソッドを実行する
  $hana->hello();
  $taro->hello();
?>
</pre>
</body>
</html>
```

```実行例.html
//print_r($hana);
//print_r($taro);
Staff Object
(
    [name] => 花
    [age]  => 21
)
Staff Object
(
    [name] => 太郎
    [age]  => 35
)
//$hana->hello();
//$taro->hello();
こんにちは！
こんにちは！
```

```クラス定義方法.php
class クラス名{
//クラス名の文頭は基本的に大文字
      public const 定数名 = 値;
      //設定した値は変更できない
      public $変数名
      //プロパティ
　    
      public function メソッド名(){
      }
}
```

```インスタンス作り方.php
$変数名 = new クラス名();
//()は省略できる
```

```値のアクセス方法.php
$インスタンス->プロパティ名
```

```値の入れ方.php
$インスタンス->プロパティ名 = 値
```

```メソッドの実行方法.php
$インスタンス->メソッド名(引数)
```

####クラスのメソッドにクラス自身のプロパティを利用する時(例文にはのってない)
```
public function hello(){
  echo "こんにちは、"{$this->name}です！","\n";
}
//$this -> プロパティ名をつけることでアクセスが可能
```

つぎはこいつら
・コンストラクタ
・クラス定義ファイルの読み込み
・スタティックプロパティとスタティックメソッド

```例文.php
<?php
  //Staffクラスファイルを読み込む
  require_once("Staff.php")
?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Staff クラスメンバーを使う</title>
</head>
<body>
<pre>
<?php
//クラスメソッドを実行
Staff::deposit(100);
Staff::deposit(150);
//クラスプロパティを確認する
echo Staff::$piggBank, "円になりました。"\n";

//インスタンスを作る
$hana = new Staff("花",21);
//インスタンスメソッドを実行する
$hana->latePenalty();
//クラスプロパティを確認する
echo Staff::$piggyBank, "円になりました。"\n";
?>
</pre>
</body>
</html>
```

```出力例.html
250円になりました。
1250円になりました。

```

```コンストラクタ.php
function__construct(引数1、引数2…){
  //処理
}
```
コンストラクタは、インスタンスを作成した時に自動で発動するメソッド。


```クラス定義ファイルの読み込み.php
require_once()
//()にはひっぱり元のファイルが置いてあるパスを記入。(同じフォルダ内にある場合はファイル名でも良い）
```
クラス定義をする場合はクラス定義をしたファイルを作り、利用するファイル上で読み込ませるのが主流。
読み込ませるための指示がrequire_once()


```スタティックプロパティとスタティックメソッド.php
class クラス名{
  //スタティックプロパティ
  public static const定数名 = 値;
  public static $変数名;

  //スタティックメソッド
  public static function メソッド名(){
  }
}
```
クラス自身にプロパティやメソッドを付与することも可能。
生成するインスタンスが共通項として持つ物に関しては、こちらを利用する。

##クラスの継承
新たにクラスを作成する際、既存のクラスを再利用して作成ができる。
###覚えること
・継承の仕方
・継承したメソッド、プロパティ、コンストラクタの利用方法
・継承したクラスの情報の上書き方法(オーバーライド)

####継承の仕方
```継承の仕方.php
claas 子クラス extends 親クラス{
}
//新たに生成するクラス名が「子クラス」継承先のことを「親クラス」と呼ぶ
```
####継承したメソッド、プロパティ、コンストラクタの利用方法
```継承したメソッド、プロパティ、コンストラクタの利用方法.php
子クラス名 -> 継承されたメソッド名()
//継承したメソッドの利用方法

子クラス名 -> プロパティ名
//継承したプロパティの利用方法

parent::__construct(引数);
処理
}
//継承したコンストラクトの利用方法
```
メソッドとプロパティは通常通り記述すれば問題なし。（継承はメソッドとプロパティのコードがコピーされていると認識すれば良い）
コンストラクトの場合のみ、parent::をつける。(継承したコンストラクトを使うのか子クラスにコンストラクトを付与したのかわかるようにするため)


####継承したクラスの情報の上書き方法(オーバーライド)
継承したプロパティやメソッドのデータを上書きすることができる。上書きする場合は、子クラスへ親クラスに存在するメソッドやプロパティと同じ名前でメソッドやプロパティを付与する。

##トレイト
よくわかりません。
誰か教えてください。