にっき
2008/03/18 20:13:47
りふれくしょん
そろっぷので〜た抽出用すくりぷとで思ってたよりも変動がちょくちょくあるから
更新日によって最適な抽出めそっどを使えるようにってことで描きなおしてたけど・・・
とりあえず動作は確認できたから抽象化してこんなかんじで☆
でも結果は・・・
ふぇ?(´・ω・`;【みかん
なんだかへんなかんじだから両方の prepare の get_class_methods を出力してみたら
get_class_methods だと $this 使っても protected はめにう?(´・ω・`;【みかん
そ〜いえば,5系ならりふれくしょんが使えたはずだからあれならいけるかなぁ?
ってことで AbstractProcess::prepare を描き替えて実験☆
ばっちり取れてるよいこにう d(・x<。【みかん
ってことでさっそくりふれくしょんを使って描きなおし☆
しかたないから public にするしかないのかなぁ?
どれが実装されるかなんてわかんないから外から呼ぶことはないと思うけど・・・
ってことでけっきょく
実際はもうちょっとおまけが付いてるけど細かいことは気にしないってことで☆
・・・ってけっきょくどっちも public にしないとならりふれくしょん使う必要にゃいね(´・ω・`;【みかん
更新日によって最適な抽出めそっどを使えるようにってことで描きなおしてたけど・・・
とりあえず動作は確認できたから抽象化してこんなかんじで☆
<?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 じゃないゆ〜ざえ〜じぇんとからの描き込みを制限してますです☆
該当しちゃうかたはてきとうにゆ〜ざえ〜じぇんとを偽装しちゃってくださいです(´ω`;【みかん