001 | <?php |
002 | doMultiProcesses($argc , $argv); |
003 | //コマンド |
004 | function doMultiProcesses($num,$param){ |
005 | if ($num < 2){ |
006 | echo "コマンドが入力されていません。\n" ; |
007 | return ; |
008 | } |
009 | execProcess($param); |
010 | } |
011 |
012 | //コマンドの実行 |
013 | function execProcess($arg) |
014 | { |
015 | switch ($arg[1]){ |
016 | case "xml" : |
017 | if ( count ($arg) < 3){ echo "引数が足りていません\n" ; return ;} |
018 | $process = new XMLLoader($arg[2]); |
019 | break ; |
020 | default : |
021 | echo "設定されていないコマンドです。\n" ; |
022 | return ; |
023 | } |
024 | $process->execute(); |
025 | $processes = new Launcher(); |
026 | $processes->setProcesses($process->processes); |
027 | //$processes->isQueue = false; |
028 | $processes->execute(); |
029 | |
030 | } |
031 |
032 |
033 | /*********************** |
034 | * |
035 | * 抽象クラス |
036 | * |
037 | **********************/ |
038 | abstract class AbstractProcess{ |
039 | abstract public function execute(); |
040 | abstract public static function toString(); |
041 | } |
042 |
043 | class Process |
044 | { |
045 | public $params; |
046 | public $name; |
047 | |
048 | public function Process($name,$params){ |
049 | $this->name = $name; |
050 | $this->params = $params; |
051 | } |
052 | |
053 | public static function create($name,$params) |
054 | { |
055 | $className = $name; |
056 | $classParams = $params; |
057 | if ( class_exists ($className)){ |
058 | $process = new $className($classParams); |
059 | } else { |
060 | echo $className . "という処理がみつかりません。\n" ; |
061 | } |
062 | return $process; |
063 | } |
064 | } |
065 |
066 | /*********************** |
067 | * |
068 | * 複数コマンドの実行用 |
069 | * |
070 | ***********************/ |
071 |
072 | final class Launcher extends AbstractProcess{ |
073 | |
074 | public $processes; |
075 | public $isQueue; |
076 | |
077 | public function Launcher(){ |
078 | $this->isQueue = true; |
079 | } |
080 | |
081 | public function setProcesses($value){ |
082 | $this->processes = $value; |
083 | } |
084 | |
085 | public function execute(){ |
086 | while ( count ($this->processes) > 0){ |
087 | if ($this->isQueue){ |
088 | $process = array_shift ($this->processes); |
089 | } else { |
090 | $process = array_pop ($this->processes); |
091 | } |
092 | $process->execute(); |
093 | } |
094 | } |
095 | |
096 | public static function toString(){ |
097 | return "Launcher" ; |
098 | } |
099 | } |
100 |
101 |
102 | /*********************** |
103 | * |
104 | * コマンドローダー |
105 | * |
106 | ***********************/ |
107 |
108 | class XMLLoader extends AbstractProcess{ |
109 | |
110 |
111 | |
112 | private $path = "" ; |
113 | public $processes; |
114 | |
115 | public function XMLLoader($path){ |
116 | $this->path = $path; |
117 | $this->processes = array (); |
118 | } |
119 |
120 | public function execute(){ |
121 | |
122 | if (! file_exists ($this->path)) { |
123 | echo "ファイルが存在しません\n" ; |
124 | return ; |
125 | } |
126 | try{ |
127 | $xml = simplexml_load_file($this->path); |
128 | }catch(Exception $e ){ |
129 | echo "XMLの書式が間違っています\n" ; |
130 | return ; |
131 | } |
132 |
133 | foreach ( $xml->process as $process){ |
134 | $name = (string)($process->name); |
135 | $param = (string)($process->param); |
136 | $prc = Process::create($name,$param); |
137 |
138 | if ($prc instanceof AbstractProcess) |
139 | array_push ($this->processes,$prc); |
140 | } |
141 | } |
142 |
143 | public static function toString() |
144 | { |
145 | return "XMLLoader" ; |
146 | } |
147 | } |
148 |
149 | /*********************** |
150 | * |
151 | * サンプルコマンド |
152 | * |
153 | ***********************/ |
154 | class Test extends AbstractProcess |
155 | { |
156 | private $param; |
157 | public function Test($param){ |
158 | $this->param = $param; |
159 | } |
160 |
161 | public function execute(){ |
162 | |
163 | echo $this->param . "\n" ; |
164 | } |
165 |
166 | public static function toString() |
167 | { |
168 | return "Test" ; |
169 | } |
170 |
171 | } |
これを使って以下のXMLを読み込んで実行する。
01 | < data > |
02 | < process > |
03 | < name >Test</ name > |
04 | < param >param1</ param > |
05 | </ command > |
06 | < process > |
07 | < name >Test</ name > |
08 | < param >param2</ param > |
09 | </ process > |
10 | </ data > |
実行
1 | mr-elephant:php shuzo$ php process.php xml ./process.xml |
2 | param1 |
3 | param2 |
とりあえず必要なものだけを実装してみました。
もうちょいなんか工夫できそうな気がします。
というかGithubにあげてみたいと思ったのですが、うまくいってません。orz
※インデントが気持ち悪いところだけ修正しました。
※commandという名前はあまりよくないというご指摘を受けたので、修正しました。
どうせなので、微妙にリファクタリングを追加。