gpt4 book ai didi

php - 如何准备一个方法/函数调用以在以后调用它?

转载 作者:行者123 更新时间:2023-12-04 05:08:49 24 4
gpt4 key购买 nike

这是“准备/存储函数调用”* 的最佳方式,以便稍后实际执行它?

(* 带有不确定数量的参数)

我现在所拥有的:

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,包括“不确定的参数数量”特征

如何改进我的代码?

提前谢谢你

最佳答案

您可能对 Command pattern 感兴趣.
你如何实现它取决于你 - 或者你正在使用的框架。
但这些模式通常会叠加。因此,也请仔细阅读“周围”模式,以便能够对实际实现(或选择现有库)做出正确的选择。

完全非正式的:

<?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() ) {
// ...
}
}

或者别的什么...

关于php - 如何准备一个方法/函数调用以在以后调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15153588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com