孤独プログラマー譚

孤独死が近い。

PHP Proxyパターンを楽に実装する

Proxyパターンは有用である。最近知ったから使ったことないけど。

例えば、以下、RobotクラスとMissileクラス。
ロボットクラスは、ミサイルの発射をミサイルクラスに委譲している。

<?php
class Robot
{
    function __construct()
    {
        $this->missile = new Missile();
    }

    function launchMissile()
    {
        $this->missile->fire();
    }
}

class Missile
{
    public function fire()
    {
        echo '発射!';
    }
}

$robot = new Robot();
$robot->launchMissile();

発射!


しかし、ただ発射するだけでは地味なので、おっぱいからミサイルを発射するように改造したとする。

<?php
class Robot
{
    function __construct()
    {
        $oppai = new Oppai();
        $oppai->missile = new Missile();
        $this->missile = $oppai;
    }

    function launchMissile()
    {
        $this->missile->fire();
    }
}

class Oppai
{
    public function fire()
    {
        echo 'おっぱいミサイル';
        $this->missile->fire();
    }
}

おっぱいミサイル発射!


Missileクラスを一切触っていない。
実行元なる Robot::launchMissile にも一切手を加えていない。
このように、共通のインターフェイスを持つ中間層のクラスを差し込むことで、色々と応用を利かせることが出来る。

ただ、問題点がある。
Missileクラスが100個メソッドを持っていれば、Oppaiクラスにも同名のメソッドを100個用意する必要がある。

でも大丈夫。

<?php
class Oppai
{
    public function __call($name, $args)
    {
        echo '超おっぱいミサイル';
        $this->missile->{$name}($args);
    }
}

超おっぱいミサイル発射!


PHPには、__call() というマジックメソッド(と呼ばれる特殊なメソッド群)が存在する。
存在しないメソッド名が呼ばれると、この __call() が実行される。

これで、面倒なProxyパターンも気軽に使っていける。