PHPでクラスを使う


##はじめに
jsしか書いたことがなかったので、馴染みのない書き方が結構ありました。
間違っているかもしれないので、コメントください。

##クラスの基本設定

```PHP
<?php
class User
{
  //メンバー
  public $name;
  private $nickname;

  //コンストラクタ
  public function __construct($name,$nickname){
  	//引数をメンバー変数に格納
    $this->name = $name;
    $this->nickname = $nickname;
  }
}

//インスタンス化
$user = new User('sato','unko');

echo $user->name;
echo $user->nickname;//Fatal error: Cannot access private property

?>
```

###コンストラクタ

コンストラクタは``__construct``でメソッドを作成します。


###メンバーへのアクセス
メンバー変数へのアクセスは、``->``を使う。jsでの``this.name``と似た感じ？
``$this->$name = $name;``ではなく、``$this->name = $name;``なのはPHPのルール。

###アクセス修飾子

| アクセス修飾子 | 意味 |
|--------|--------|
|     public   | 外部から参照できる       |
|     private   | 変数、関数を宣言したクラス内のみ参照できる       |
|     protected   | 変数、関数を宣言したクラスと継承されたクラスから参照できる     |

下記のように何も宣言しない場合は、publicとして扱われる。

```PHP
<?php
class User
{
  $name;
```

##クラスを継承

```PHP
<?php
class User
{
  //メンバー
  public $name;

  //コンストラクタ
  public function __construct($name){
  	//引数をメンバー変数に格納
    $this->name = $name;
  }

  protected function changeName($new_name){
    $this->name = $new_name;
  }
}

//classを継承
class ChildUser extends User{
  public function subChangeName($new_name){
    //protectedの関数は子クラスから呼ぶことは可能
    $this->changeName($new_name);
  }
};

//インスタンス化
$user = new User('sato');
echo $user->name;//sato

//Userクラスを継承したクラスをインスタンス化
$new_user = new ChildUser('kato');

$new_user->subChangeName('chinko');
echo $new_user->name;//chinko
?>
```

###継承方法

継承するには、extendsキーワードを使います。
※多重継承はできません。

```
class クラス名 extends 継承するクラス{}
```

###オーバーライド

変数や、関数は同じ名前を子クラスに定義すれば、親クラスの変数、関数を上書きすることができます。

```PHP
<?php
class User
{
  //メンバー
  private $name;

  //コンストラクタ
  public function __construct($name)
  {
  	//引数をメンバー変数に格納
    $this->name = $name;
  }

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

//classを継承
class ChildUser extends User{
  public function changeName($new_name){
    $this->name = $new_name . 'です。';
  }
};

//インスタンス化
$user = new User('sato');
//echo $user->name;//sato

$new_user = new ChildUser('sato');

$new_user->changeName('chinko');
echo $new_user->name;//chinkoです。
?>
```

オーバーライドされたくない場合は、``final``キーワードを使用します。
オーバーライドされた場合、エラーメッセージが表示されます。

```PHP
<?php
class User
{
  //メンバー
  private $name = '佐藤';

  final public function changeName($new_name){
    $this->name = $new_name;
  }
}

//classを継承
//Fatal error: Cannot override final method
class ChildUser extends User{
  public function changeName($new_name){
    $this->name = $new_name . 'です。';
  }
};

?>
```

###クラス内で定数を使う

クラス内の定数は``define ``ではなく、``const``キーワードを使う。

```PHP
<?php
class User
{

  const CITY = 'TOKYO';

  public function __construct($name){
      //定数を表示
      echo self::CITY;//TOKYO
  }
}
```

####constの使い方
クラス自身を指す``self``キーワードと``::``を使用する。

```
self::定数名
```

##トレイト
コードの再利用をする為の仕組み。多重継承のような、使い勝手を実現してくれます。


```PHP
<?php

trait GreetAtrait{
  public function morning(){
    echo $this -> name . 'です。おはようございます。';
  }
  public function evening(){
    echo $this -> name . 'です。こんにちわ。';
  }
}

trait GreetBtrait{
  public function morningB(){
    echo $this -> name . 'です。眠いです。';
  }
  public function eveningB(){
    echo $this -> name . 'です。まだ眠いです。';
  }
}

class User
{
  //トレイトを指定
  use GreetAtrait,GreetBtrait;

  private $name;

  //コンストラクタ
  public function __construct($name){
      //引数をメンバー変数に格納
      $this->name = $name;
  }
}

$user = new User('佐藤');

$user -> morning();//佐藤です。おはようございます。
$user -> evening();//佐藤です。こんにちわ
$user -> morningB();//佐藤です。眠いです。
$user -> eveningB();//佐藤です。まだ眠いです。

?>

```

###トレイトを追加

```
class User{
  use トレイト名;
```

###トレイトを複数追加

```
class User{
  use トレイト名,トレイト名;
```

###トレイトの注意点

便利な半面、むやみに使っていると、複雑な依存関係をもってしまい密結合になってしまう。


##まとめ
クラスの基礎の基礎くらいは理解できたかもしれません。
インターフェイスなども調べていこうと思います。