<?php
doMultiProcesses($argc , $argv);
//コマンド
function doMultiProcesses($num,$param){
if($num < 2){
echo "コマンドが入力されていません。\n";
return;
}
execProcess($param);
}
//コマンドの実行
function execProcess($arg)
{
switch($arg[1]){
case "xml":
if(count($arg) < 3){ echo "引数が足りていません\n";return;}
$process = new XMLLoader($arg[2]);
break;
default:
echo "設定されていないコマンドです。\n";
return;
}
$process->execute();
$processes = new Launcher();
$processes->setProcesses($process->processes);
//$processes->isQueue = false;
$processes->execute();
}
/***********************
*
* 抽象クラス
*
**********************/
abstract class AbstractProcess{
abstract public function execute();
abstract public static function toString();
}
class Process
{
public $params;
public $name;
public function Process($name,$params){
$this->name = $name;
$this->params = $params;
}
public static function create($name,$params)
{
$className = $name;
$classParams = $params;
if(class_exists($className)){
$process = new $className($classParams);
}else{
echo $className . "という処理がみつかりません。\n";
}
return $process;
}
}
/***********************
*
* 複数コマンドの実行用
*
***********************/
final class Launcher extends AbstractProcess{
public $processes;
public $isQueue;
public function Launcher(){
$this->isQueue = true;
}
public function setProcesses($value){
$this->processes = $value;
}
public function execute(){
while(count($this->processes) > 0){
if($this->isQueue){
$process = array_shift($this->processes);
}else{
$process = array_pop($this->processes);
}
$process->execute();
}
}
public static function toString(){
return "Launcher";
}
}
/***********************
*
* コマンドローダー
*
***********************/
class XMLLoader extends AbstractProcess{
private $path = "";
public $processes;
public function XMLLoader($path){
$this->path = $path;
$this->processes = array();
}
public function execute(){
if(!file_exists($this->path)) {
echo "ファイルが存在しません\n";
return;
}
try{
$xml = simplexml_load_file($this->path);
}catch(Exception $e ){
echo "XMLの書式が間違っています\n";
return;
}
foreach( $xml->process as $process){
$name = (string)($process->name);
$param = (string)($process->param);
$prc = Process::create($name,$param);
if($prc instanceof AbstractProcess)
array_push($this->processes,$prc);
}
}
public static function toString()
{
return "XMLLoader";
}
}
/***********************
*
* サンプルコマンド
*
***********************/
class Test extends AbstractProcess
{
private $param;
public function Test($param){
$this->param = $param;
}
public function execute(){
echo $this->param . "\n";
}
public static function toString()
{
return "Test";
}
}
これを使って以下のXMLを読み込んで実行する。
<data>
<process>
<name>Test</name>
<param >param1</param>
</command>
<process>
<name>Test</name>
<param >param2</param>
</process>
</data>
実行
mr-elephant:php shuzo$ php process.php xml ./process.xml
param1
param2
とりあえず必要なものだけを実装してみました。
もうちょいなんか工夫できそうな気がします。
というかGithubにあげてみたいと思ったのですが、うまくいってません。orz
※インデントが気持ち悪いところだけ修正しました。
※commandという名前はあまりよくないというご指摘を受けたので、修正しました。
どうせなので、微妙にリファクタリングを追加。