オブジェクト指向について個人的まとめ

PHPを最近習い始めたついでにオブジェクト指向についてまとめていきます。
個人的なまとめとしていますが、参考になればと思います。
誤った記述がされている箇所を発見したら教えてくれるとうれしいです。
# Standard PHP Library(SPL)
とても便利なクラスを利用するためにPHP5から導入されたライブラリ。
便利なクラスにどんなものがあるかは後述。

# マジックメソッド
PHPで既に役割が割り当てられている関数のことで、すべてアンダースコア2つ(__)ではじまる。
マジックメソッドはそれぞれに決められたタイミング(クラスを呼び出した直後とか)にPHPが呼び出す。
下で知っておくべきマジックメソッドをまとめた。
マジックメソッドの一覧は[ここ](http://php.net/manual/ja/language.oop5.magic.php)

## construct, destructメソッド
読み方はconstruct(コンストラクタ)メソッドとdestruct(デストラクタ)メソッド。
### constructメソッド
クラスをインスタンス化したときに最初に実行されるメソッド。
こんな感じで書きます。

```php:construct.php
<?php

class Testclass
{
    function __construct()
    {
        print "これがTestclassをインスタンス化したときに実行される";
    }
}


$testdesu = new Testclass();
//実行結果:これがTestclassをインスタンス化したときに実行される
```

上のコードではTestclassというクラスをインスタンス化したときに文字が表示される。
コンストラクタメソッドは、インスタンスの初期化をしたいときとかに使う。

### destructメソッド
プログラムの終了する直前に実行される。
こんな感じで書きます。

```php:destruct.php
<?php

class Testclass
{
    function __construct()
    {
        print "これがTestclassをインスタンス化したときに実行される\n";
    }

    function __destruct()
    {
        print "プログラムの終了直前に実行される\n";
    }
}

$test = new Testclass();
/*
実行結果:
これがTestclassをインスタンス化したときに実行される
プログラムの終了直前に実行される
*/
```
このコードではTestclassをインスタンス化してプログラムが終了するときにデストラクタを実行し、メッセージを出力する。
ログの出力とか、プログラムの終了時に必ずやっておきたいことを書いたりする。
destructは自爆という意味(どうでもいい)
## get, setメソッド
読み方はいわずもがな。
get(ゲット)メソッドとset(セット)メソッド。
### getメソッド
アクセス修飾子の設定や未定義が原因でアクセスできないプロパティを取得しようとしたとき実行される。
こんな感じで書く。

```get.php
<?php

class Testclass
{
    public function __get($teste)
    {
        echo 'ほげを呼んだ';
    }
}

$foo = new Testclass();
$foo->hoge;
/*
実行結果：
ほげを呼んだ
*/
```
### setメソッド
アクセス修飾子の設定や未定義が原因でアクセスできないプロパティを取得しようとしたとき実行される。
第2引数にセットしようとした値を入れる。
こんな感じで書く。

```set.php
<?php

class Testclass
{
    public function __set($teste, $val)
    {
        echo 'ほげを呼んだ。ふがを代入しようとした。';
    }
}

$foo = new Testclass;
$foo->hoge = "ふが";
/*
実行結果：
ほげを呼んだ
*/
```
## isset, unsetメソッド
読み方はisset(イズセット)メソッドとunset(アンセット)メソッド。
### issetメソッド
アクセス修飾子の設定や未定義などが原因でアクセスができないプロパティに[empty()](http://php.net/manual/ja/function.empty.php)もしくは[isset()](http://php.net/manual/ja/function.isset.php)を実行したときに実行される。
こんな感じで書く。

```php:isset.php
<?php

class Testclass
{
    public function __isset($teste)
    {
        echo "そんなプロパティ聞いたこともない";
    }
}

$test = new Testclass;
isset($test->testes); 
/*
実行結果:
そんなプロパティ聞いたこともない
*/
```
上のコードではtestesという存在しないプロパティに[isset()](http://php.net/manual/ja/function.isset.php)を実行してみた。
### unsetメソッド
アクセス修飾子の設定や未定義などが原因でアクセスができないプロパティに[unset()](http://php.net/manual/ja/function.unset.php)を実行したときに実行される。
こんな感じで書く。

```php:unset.php
<?php

class Testclass
{
    public function __unset($teste)
    {
        echo "そんなプロパティ聞いたこともない";
    }
}

$test = new Testclass;
unset($test->testes);
/*
実行結果:
そんなプロパティ聞いたこともない
*/
```
## call, callStaticメソッド
読み方はcall(コール)メソッド、callStatic(コールスタティック)メソッド。

### callメソッド
未定義もしくはアクセス修飾子の設定などでアクセスできないクラスメソッド、インスタンスメソッドにアクセスしようとしたときに実行されるメソッド。
第1引数にメソッド名、第2引数呼び出そうとしたメソッドに渡す引数を渡す。
こんな感じで書く。

```php:call.php
<?php

class Testclass
{
    public function __call($methodname, $args)
    {
        echo 'call';
    }
}

$test = new Testclass;
$hoge = $test->hoge("test", "tetete", "tester");
/*
実行結果:
call
*/
```

### callStaticメソッド
未定義もしくはアクセス修飾子の設定などでアクセスできないクラスメソッドにアクセスしようとしたときに実行されるメソッド。
第1引数にメソッド名、第2引数呼び出そうとしたメソッドに渡す引数を渡す。
こんな感じで書く。

```php:callStatic.php
<?php

class Testclass
{
    public static function __callStatic($methodname, $args)
    {
        echo 'callStatic';
    }
}

$hoge = Testclass::hoge("test", "tetete", "tester");

/*
実行結果:
callStatic
*/
```
## sleep, wakeupメソッド
### sleepメソッド
オブジェクトを[serialize()](http://php.net/manual/ja/function.serialize.php)によってシリアル化される前に実行される。
戻り値は配列で返すことが前提。何も返さないときはnullを返しE_NOTICEエラーが発生する。

こんな感じで書く。

```php:sleep.php
<?php

class Testclass
{
    public function __sleep()
    {
        echo 'sleep';
        return array();
    }
}


$test = new Testclass;
$hoge = serialize($test);
/*
実行結果:
sleep
*/
```
### wakeupメソッド
オブジェクトを[unserialize()](http://php.net/manual/ja/function.unserialize.php)によって復元する前に実行される。
こんな感じで書く。

```php:wakeup.php
<?php

class Testclass
{
    public function __wakeup()
    {
        echo 'wakeup';
    }
}


$test = new Testclass;
$foo = serialize($test);
$bar = unserialize($foo);
/*
実行結果:
wakeup
*/
```
## toStringメソッド
オブジェクトを文字列にキャストしたときに実行されるメソッド。戻り値は文字列を返さなければいけない。
普通にオブジェクトを文字列にキャストしようとするとエラーが発生する。
こんな感じで書く。

```php:toString.php
<?php

class Testclass
{
    public function __toString()
    {
        echo 'toString' . "\n";
        return 'return';
    }
}


$test = new Testclass;
echo $test;
/*
実行結果:
toString
return
*/
```
## invokeメソッド
オブジェクトを関数として実行しようとしたとき実行される。

```php:invoke.php
<?php

class Testclass
{
    public function __invoke()
    {
        echo 'invoke';
    }
}


$test = new Testclass;
$test();
/*
実行結果:
invoke
*/
```
## cloneメソッド
オブジェクトを複製するときに実行される。

```php:clone.php
<?php

class Testclass
{
    public function __clone()
    {
        echo 'clone';
    }
}


$test = new Testclass;
$clonetest = clone $test;
/*
実行結果:
clone
*/
```