にっき

2008/03/18 20:13:47

りふれくしょん


そろっぷので〜た抽出用すくりぷとで思ってたよりも変動がちょくちょくあるから
更新日によって最適な抽出めそっどを使えるようにってことで描きなおしてたけど・・・



とりあえず動作は確認できたから抽象化してこんなかんじで☆
<?php

/**
 * @class   AbstractProcess
**/
abstract class AbstractProcess
{
    /**
     * @brief   string
    **/
    protected $_mFunc = null;
    
    /**
     * prepare
     * 
     * @param   int $updateTime
     * 
     * @return  void
    **/
    public function prepare(/*** int ***/ $updateTime)
    {
        $methods = get_class_methods($this);
        sort($methods);
        
        foreach($methods as $name)
        {
            if(substr($name,0,7) == 'execute')
            {
                if(ctype_digit($date = substr($name,7)) && $date >= $updateTime)
                {
                    $this->_mFunc = $name;
                    break;
                }
            }
        }
        
        if($this->_mFunc == null)
        {
            $this->_mFunc = 'executeLatest';
        }
    }
    
    /**
     * execute
     * 
     * @param   void
     * 
     * @return  void
    **/
    public function execute()
    {
        $this->{$this->_mFunc}();
    }
    
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    abstract protected function executeLatest();
}


/**
 * @class   UniProcess
**/
class UniProcess extends AbstractProcess
{
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    protected function executeLatest()
    {
        echo 'Latest uni<br />';
    }
    
    /**
     * execute080303
     * 
     * @param   void
     * 
     * @return  void
    **/
    protected function execute080303()
    {
        echo '08/03/03 uni<br />';
    }
}

$obj = new UniProcess();
$obj->prepare('080101');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080303');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080318');
$obj->execute();
unset($obj);

?>
これでたぶんきっと prepare の引数に応じてべすとな executeXXXXXX を起動してくれるはず☆
でも結果は・・・
Latest uni
Latest uni
Latest uni

ふぇ?(´・ω・`;【みかん
なんだかへんなかんじだから両方の prepare の get_class_methods を出力してみたら
AbstractUniProcess : Array
(
    [0] => prepare
    [1] => execute
)

UniProcess : Array
(
    [0] => prepare
    [1] => executeLatest
    [2] => execute080303
    [3] => execute
)
えぇぇぇぇ・・・
get_class_methods だと $this 使っても protected はめにう?(´・ω・`;【みかん
そ〜いえば,5系ならりふれくしょんが使えたはずだからあれならいけるかなぁ?
ってことで AbstractProcess::prepare を描き替えて実験☆
    /**
     * prepare
     * 
     * @param   int $updateTime
     * 
     * @return  void
    **/
    public function prepare(/*** int ***/ $updateTime)
    {
        $class = new ReflectionClass($this);
        $methods = $class->getMethods();
        echo '<pre>';
        print_r($methods);
        echo '</pre>';
        exit;
    }
結果は・・・
Array
(
    [0] => ReflectionMethod Object
        (
            [name] => executeLatest
            [class] => UniProcess
        )

    [1] => ReflectionMethod Object
        (
            [name] => execute080303
            [class] => UniProcess
        )

    [2] => ReflectionMethod Object
        (
            [name] => prepare
            [class] => UniProcess
        )

    [3] => ReflectionMethod Object
        (
            [name] => execute
            [class] => UniProcess
        )

)
ぅゅ☆
ばっちり取れてるよいこにう d(・x<。【みかん
ってことでさっそくりふれくしょんを使って描きなおし☆
<?php

/**
 * @class   AbstractUniProcess
**/
abstract class AbstractUniProcess
{
    /**
     * @brief   ReflectionMethod
    **/
    protected $_mFunc = null;
    
    /**
     * prepare
     * 
     * @param   int $updateTime
     * 
     * @return  void
    **/
    public function prepare(/*** int ***/ $updateTime)
    {
        $class = new ReflectionClass($this);
        $methods = $class->getMethods();
        usort($methods,create_function('$a,$b','return $a->name > $b->name;'));
        
        foreach($methods as $method)
        {
            $name = $method->name;
            if(substr($name,0,7) == 'execute')
            {
                if(ctype_digit($date = substr($name,7)) && $date >= $updateTime)
                {
                    $this->_mFunc = $method;
                    break;
                }
            }
        }
        
        if($this->_mFunc instanceof ReflectionMethod)
        {
            $this->_mFunc = new ReflectionMethod($this,'executeLatest');
        }
    }
    
    /**
     * execute
     * 
     * @param   void
     * 
     * @return  void
    **/
    public function execute()
    {
        try
        {
            $this->_mFunc->invoke($this);
        }
        catch(ReflectionException e)
        {
            echo $e;
            die();
        }
    }
    
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    abstract protected function executeLatest();
}


/**
 * @class   UniProcess
**/
class UniProcess extends AbstractUniProcess
{
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    protected function executeLatest()
    {
        echo 'Latest uni<br />';
    }
    
    /**
     * execute080303
     * 
     * @param   void
     * 
     * @return  void
    **/
    protected function execute080303()
    {
        echo '08/03/03 uni<br />';
    }
}


$obj = new UniProcess();
$obj->prepare('080101');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080303');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080318');
$obj->execute();
unset($obj);
?>
結果は・・・
exception 'ReflectionException' with message
 'Trying to invoke protected method UniProcess::execute080303() from scope ReflectionMethod'
  in /path/to/test.php:XX
Stack trace:
#0 /path/to/test.php(XX): ReflectionMethod->invoke(Object(UniProcess))
#1 /path/to/test.php(XX): AbstractUniProcess->execute()
#2 {main}
このすこ〜ぷからじゃ呼べませんなかんじで怒られたにう(´・ω・`;【みかん
しかたないから public にするしかないのかなぁ?
どれが実装されるかなんてわかんないから外から呼ぶことはないと思うけど・・・
ってことでけっきょく
<?php

/**
 * @class   AbstractUniProcess
**/
abstract class AbstractUniProcess
{
    /**
     * @brief   ReflectionMethod
    **/
    protected $_mFunc = null;
    
    /**
     * prepare
     * 
     * @param   int $updateTime
     * 
     * @return  void
    **/
    public function prepare(/*** int ***/ $updateTime)
    {
        $class = new ReflectionClass($this);
        $methods = $class->getMethods();
        usort($methods,create_function('$a,$b','return $a->name > $b->name;'));
        
        foreach($methods as $method)
        {
            $name = $method->name;
            if(substr($name,0,7) == 'execute')
            {
                if(ctype_digit($date = substr($name,7)) && $date >= $updateTime)
                {
                    $this->_mFunc = $method;
                    break;
                }
            }
        }
        
        if(!$this->_mFunc instanceof ReflectionMethod)
        {
            $this->_mFunc = new ReflectionMethod($this,'executeLatest');
        }
    }
    
    /**
     * execute
     * 
     * @param   void
     * 
     * @return  void
    **/
    public function execute()
    {
        $this->_mFunc->invoke($this);
    }
    
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    abstract public function executeLatest();
}


/**
 * @class   UniProcess
**/
class UniProcess extends AbstractUniProcess
{
    /**
     * executeLatest
     * 
     * @param   void
     * 
     * @return  void
    **/
    public function executeLatest()
    {
        echo 'Latest uni<br />';
    }
    
    /**
     * execute080303
     * 
     * @param   void
     * 
     * @return  void
    **/
    public function execute080303()
    {
        echo '08/03/03 uni<br />';
    }
}

echo '<pre>';

$obj = new UniProcess();
$obj->prepare('080101');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080303');
$obj->execute();
unset($obj);

$obj = new UniProcess();
$obj->prepare('080318');
$obj->execute();
unset($obj);
?>
なかんじのこ〜どで結果は
08/03/03 uni
08/03/03 uni
Latest uni
ってことでこれでいいのかなぁ? 〆(・x・。【みかん
実際はもうちょっとおまけが付いてるけど細かいことは気にしないってことで☆

・・・ってけっきょくどっちも public にしないとならりふれくしょん使う必要にゃいね(´・ω・`;【みかん


こめんと

こめんとする?



 
投稿された内容の著作権はこめんとの投稿者に帰属するっぽいです☆
また,現在 IE6 以下で Sleipnir,Lunascape,Donut じゃないゆ〜ざえ〜じぇんとからの描き込みを制限してますです☆
該当しちゃうかたはてきとうにゆ〜ざえ〜じぇんとを偽装しちゃってくださいです(´ω`;【みかん
さぶこんてんつ
前月 2024年 11月 翌月
          1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10
 
11
 
12
 
13
 
14
 
15
 
16
 
17
 
18
 
19
 
20
 
21
 
22
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30
 
             
  • あじ あじ
  • ED ED
  • えでん えでん
  • えれふぃ えれふぃ
  • ぐらぶれ ぐらぶれ
  • etc etc
  • にっき にっき

あわせて読みたい

先頭に戻る
めにう 先頭に戻る