PHP文法基礎まとめ２

#はじめに
PHP初心者向けに基礎内容をまとめた第2弾です。
PHP文法基礎まとめ１は[こちら](https://qiita.com/WorldLab5/items/00b15bd97a1dd0ba27fd)

##クラス
###概要
クラスは、変数や定数、関数をひとまとめにしたものです。
newを使うことで、インスタンス化してクラスを生成することができ、コンストラクタはクラス生成時に必ず呼ばれます。
$thisはクラス自身を指し、アロー演算子(->)でプロパティやメソッドを参照できます。

```php
class User{
  // プロパティ
  public $name;

  // コンストラクタ
  public function __construct($name){
    $this->name = $name;
  }

  // メソッド
  public function showName(){
    echo "method: $this->name";
  }
}

$user = new User("tanaka");
echo "property: $user->name<br>";
$user->showName();
```

```
property: tanaka
method: tanaka
```
###継承・オーバーライド
クラスは、extendsで指定したクラスを継承することができます。継承することにより、継承元のクラスの中身を引継ぎ、同等に扱うことができます。
また、オーバーライドとは上書きを言います。メソッド名及び引数が等しい時にオーバーライドされ、継承元の処理は実行されません。

```php
class User {
  public $name;

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

  public function showName(){
    echo "method: $this->name";
  }
}

class SpecialUser extends User {
  public function showName(){
    echo "override method: $this->name";
  }
}

$user = new SpecialUser("tanaka");
echo "property: $user->name<br>";
$user->showName();
```

```
property: tanaka
override method: tanaka
```
###アクセス権
アクセス権を設定することにより、クラスの使用に制限を設けることができます。
アクセス権には次の３つがあります。
・public ⇒ 全域からアクセスが可能
・protected ⇒ 親子クラスとクラス内からのみアクセス可能
・private ⇒ クラス内からのみアクセス可能

```php
class User {
  protected $name;
}

$user = new User();
echo "property: $user->name<br>";
```

```
Fatal error: Uncaught Error: Cannot access protected property SpecialUser::$name in ・・
```

###static
staticは、クラスをインスタンス化しなくても、使えるようにする仕組みです。
クラス内で参照する時は$thisではなく、selfを使います。

```php
class User{
  public static $count = 0;

  public static function showCount(){
    self::$count++;
    echo 'static method:'. self::$count.'<br>';
  }
}

echo 'static property:'. User::$count.'<br>';
User::showCount();
User::showCount();
```

```
static property:0
static method:1
static method:2
```

###const
クラスで定数を定義する時は、defineの代わりにconstを使います。定数のため、値を変更することはできません。
constは、指定がなければpublicの扱いになります。

```php
class Constants {
  const MAX_VALUE = 10;

  public static function getMaxValue(){
    return self::MAX_VALUE;
  }
}

echo "const MaxValue:". Constants::MAX_VALUE."<br>";
echo "method MaxValue:". Constants::getMaxValue();
```

```
const MaxValue:10
method MaxValue:10
```

###抽象クラス
抽象クラスは、abstractをつけることによりインスタンス化することができず、拡張クラスが継承して使用します。
単独で使用した場合、エラーになります。アクセス権や引数の数は、抽象クラスに合わせて継承します。

```php
abstract class BaseUser{
  public $name;

  abstract public function showName();
}

class User extends BaseUser{
  public function __construct($name){
    $this->name = $name;
  }

  public function showName(){
    echo "method: $this->name";
  }
}

$user = new User("tanaka");
echo "property: $user->name<br>";
$user->showName();
```

```
property: tanaka
method: tanaka
```

###interface
interfaceは、クラスが実装する必要があるメソッドを定義します。メソッドの内容を記述することはできません。
インスタンス化することができず、拡張クラスが実装しなければいけません。
クラスの継承は一つまでしかできませんが、interfaceは複数実装することができます。

```php
interface interfaceUser{
  public function showName();
}

class User implements interfaceUser{
  public $name;

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

  public function showName(){
    echo "method: $this->name";
  }
}

$user = new User("tanaka");
echo "property: $user->name<br>";
$user->showName();
```

```
property: tanaka
method: tanaka
```

###finalキーワード
final を前に付けて定義されたメソッドは、子クラスから上書きできません。
クラス自体がfinalと定義された場合には、このクラスを拡張することはできません。

```php
class User{
  public $name;

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

  final public function showName(){
    echo "method: $this->name";
  }
}

class SpecialUser extends User {
  public function showName(){
    echo "override method: $this->name";
  }
}
```

```
Fatal error: Cannot override final method User::showName() in ・・
```

###トレイト
トレイトはクラスと似ていますが、単にいくつかの機能をまとめるためだけのものです。トレイト自身のインスタンスを作成することはできません。
クラス内でuse宣言することで、トレイトのメソッドを使用することができます。

```php
trait nameInfo {
  public function showName($name){
    echo "trait method: $name";
  }
}

class User{
  use nameInfo;
}

$user = new User();
$user->showName('tanaka');
```

```
trait method: tanaka
```

##関数
###文字列関数
文字列の長さの取得、検索、比較等の操作を行いたい時は、標準で用意されているString関数を使います。
日本語を扱う時は、マルチバイト文字列関数を使用します。
String関数リファレンス：https://www.php.net/manual/ja/ref.strings.php
マルチバイト文字列関数リファレンス：https://www.php.net/manual/ja/ref.mbstring.php

```php
$str = "Hello";
$str2 = "hello";
$search = "e";

$split = str_split($str, 3);     // 文字列を配列に変換する
$pad = str_pad($str, 7, "_", STR_PAD_LEFT); // 固定長の他の文字列で埋める
$len = strlen($str);             // 文字列長さ
$pos = strpos($str, $search);    // 部分文字列が最初に現れる場所を返す
$cmp = strcmp($str, $str2);      // バイナリセーフな文字列比較

echo 'split = ', var_dump($split). '<br>';
echo "pad = $pad<br>";
echo "len = $len<br>";
echo "pos = $pos<br>";
echo "cmp = $cmp<br>";
```

```
split = array(2) { [0]=> string(3) "Hel" [1]=> string(2) "lo" }
pad = __Hello
len = 5
pos = 1
cmp = -1
```

###数学関数
最大値(最小値)の取得、小数点切り上げ(切り捨て)、指数計算等の数学に関連する操作を行いたい時は、標準で用意されているMath関数を使います。
Math関数リファレンス：https://www.php.net/manual/ja/ref.math.php

```php
$max = max(2, 3, 1, 6, 7);  // 最大値
$min = min(2, 3, 1, 6, 7);  // 最小値
$floor = floor(1.6);        // 端数の切り捨て
$ceil = ceil(1.6);          // 端数の切り上げき
$pow = pow(2, 10);          // 2の10乗
$rand = rand(1, 100);       // 1～100のランダム

echo "max = $max<br>";
echo "min = $min<br>";
echo "floor = $floor<br>";
echo "ceil = $ceil<br>";
echo "pow = $pow<br>";
echo "rand = $rand<br>";
```

```
max = 7
min = 1
floor = 1
ceil = 2
pow = 1024
rand = 21
```
##その他
###外部ファイルの読み込み
外部ファイルの読み込みには下記の4種類があります。
requireはファイルがなければエラーがでます。includeはファイルがなくてもエラーがでません。onceがあると、ファイルがすでに読み込まれているかどうかを、PHPがチェックします。
・require
・require_once
・include
・include_once

```php:function.php
class User{
  public $name;

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

  public function showName(){
    echo "method: $this->name";
  }
}
```

```php:index.php
require "function.php";

$user = new User("tanaka");
echo "property: $user->name<br>";
$user->showName();
```

```
property: tanaka
method: tanaka
```

###例外処理
例外とはException(エラー)のことを指し、例外が起きることを想定して、例外が起きた場合の処理を記述することができます。try～catchの間でExceptionを検知し、catchの中でExceptionを検知した場合の処理を行います。
finallyがあると例外の有無に関わらず、最後に必ず処理が行われます。throwで例外を投げることができます。

```php
try {
  throw new Exception("例外が発生しました。<br>");
} catch (Exception $e) {
  echo $e->getMessage();
}finally{
  echo "finally<br>";
}
echo "Hello World";
```

```
例外が発生しました。
finally
Hello World
```

以上です。