2

後で実際に実行するために「関数呼び出しを準備/保存する」*ための最良の方法はどれですか?

(※パラメータ数未定)

私が今持っているもの:

function addCall($className, [$parameter [, $parameter ...]]) 
{ 
    $this->calls[] = func_get_args();
}

それから私はやります:

foreach($this->calls as $args) 
{ 
    $r = new ReflectionClass(array_shift($args));
    $instances[] = $r->newInstanceArgs($args);
}

これは、「未定のパラメーター数」の特徴を含め、私にはあまりOOPに見えません

コードを改善するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

3

コマンドパターンに興味があるかもしれません。
それをどのように実装するかはあなた次第です-またはあなたが使用しているフレームワーク。
しかし、これらのパターンは通常積み重なっています。したがって、「周囲の」パターンもよく読んで、実際の実装(または既存のライブラリの選択)に関して適切な選択を行えるようにしてください。

完全に非公式:

<?php
function foo($a, $b) {
    return 'foo#'.($a+$b);
}

function bar($a,$b,$c) {
    return 'bar#'.($a-$b+$c);
}

$cmds = array();
$cmds[] = function() { return foo(1,2); };
$cmds[] = function() { return bar(1,2,3); };
$cmds[] = function() { return bar(5,6,7); };
$cmds[] = function() { return foo(9,7); };
$s = new stdClass; $s->x = 8; $s->y = 8;
$cmds[] = function() use($s) { return foo($s->x,$s->y); };


// somewhere else....
foreach($cmds as $c) {
    echo $c(), "\n";
}

またはのようなもの

<?php
interface ICommand {
    public function /* bool */ Execute();
}

class Foo implements ICommand {
    public function __construct($id) {
        $this->id = $id;
    }
    public function Execute() {
        echo "I'm Foo ({$this->id})\n";
        return true;
    }
}

class Bar implements ICommand {
    public function __construct($id) {
        $this->id = $id;
    }
    public function Execute() {
        echo "I'm Bar ({$this->id})\n";
        return true;
    }
}

$queueCommands = new SplPriorityQueue();

$queueCommands->insert(new Foo('lowPrio'), 1);
$queueCommands->insert(new Foo('midPrio'), 2);
$queueCommands->insert(new Foo('highPrio'), 3);
$queueCommands->insert(new Bar('lowPrio'), 1);
$queueCommands->insert(new Bar('midPrio'), 2);
$queueCommands->insert(new Bar('highPrio'), 3);

// somewhere else....
foreach( $queueCommands as $cmd ) {
    if ( !$cmd->execute() ) {
        // ...
    }
}

または、他の何か ...

于 2013-03-01T09:01:39.510 に答える