Reading:オブ脳本(7)Template Methodパターン(PHP5編)

オブ脳本、超手抜きパターン取得法の章に戻って、Template Methodパタンの例をPHP5で書いてみました。

実行結果

$ php -f Shacho.php -- Tanto 小川 100
担当小川起立します。給料は100円です。
$ php -f Shacho.php -- Shunin 中川 100
主任中川起立します。給料は201円です。

Shain.php

<?php
abstract class Shain {
    private $_name;
    private $_kihonkyu;

    public function __construct($name, $kihonkyu)
    {
        $this->_name = $name;
        $this->_kihonkyu = $kihonkyu;
    }

    public final function standup()
    {
        echo $this->_getYakushoku() . $this->_name . '起立します。'
           . '給料は' . $this->_getKyuryo() . '円です。' . "\n";
    }

    protected function _getKihonkyu() {
        return $this->_kihonkyu;
    }

    abstract protected function _getKyuryo();
    abstract protected function _getYakushoku();
}

Tanto.php

<?php
class Tanto extends Shain
{
    protected function _getKyuryo()
    {
        return $this->_getKihonkyu();
    }

    protected function _getYakushoku()
    {
        return '担当';
    }
}

Shunin.php

<?php
class Shunin extends Shain
{
    protected function _getKyuryo()
    {
        return $this->_getKihonkyu() * 2 + 1;
    }

    protected function _getYakushoku()
    {
        return '主任';
    }
}

Shacho.php

<?php
function __autoload($className) {
    require $className . '.php';
}

class Shacho
{
    public function main($argv)
    {
        $shain = null;
        switch ($argv[1]) {
            case 'Tanto':
            case 'Shunin':
                $className = $argv[1];
                $shain = new $className($argv[2], (int)$argv[3]);
                break;
            default:
                exit('undefined class name.' . "\n");
        }
        $shain->standup();
    }
}

if ($argc !== 4) {
    exit('invalid arguments.' . "\n");
}

$shacho = new Shacho();
$shacho->main($argv);