向PHP传递数量不确定的参数



可能重复:
PHP函数的参数不受限制
将未定义数量的参数转发到另一个函数

我正在设置Gearman服务器,以便"委托"对象上方法的执行,例如:

$user->synchronize();

$event->publish('english', array('remote1','remote2') );

(其中remote1和remote2是远程社交网络)

我的想法是将对象、方法名和参数(还有一些其他参数,如语言)封装到一个对象中,我可以序列化该对象并将其发送给gearman worker,如下所示:

class bzkGearmanWrapper {
public $object;
public $method;
public $args; 
/*
* @param  $object (object) any object
* @param  $method (string) the name of the method to execute
* @param  $args    an argument or an array containing the arguments to pass to the method
*/
private function __construct($object, $method, $args )  { 
$this->object = $object;
$this->method = $method;
$this->args = $args;
}
private function execute() {
$object = $this->object;
$method = $this->method;
$args   = $this->args;
return $object->{$method}($args);
}
}

然后我就可以在我的主脚本中

$client =new GearmanClient();
// instead of :  $user->synchronize();
$params = new bzkGearmanWrapper($user, 'synchronize');
$client->do('execute', $params);
// instead of : $event->publish('english', array('remote1','remote2') );
$targets = array('remote1', 'remote2');
$params = new bzkGearmanWrapper($event, 'publish', array('english', $targets); 
$client->do('execute', $params);

在我的齿轮工中,我可以简单地称之为这样的"执行"任务

function execute($job) {
$wrapper = unserialize( $job->workload() ); 
return $wrapper->execute(); 
}

如果我只给出一个参数,上面执行的方法会起作用,但如果我需要给出不确定数量的参数,我该怎么做呢。我的大多数方法最多使用2个参数,我可以写

return $object->{$method}($arg1, $arg2);

一种解决方案是使用eval(),但我更愿意避免它

你知道把参数传递给函数的方法吗?

编辑

此主题已被关闭,因为它是两个旧主题的重复。第一个是关于call_user_func_array()函数,它将为用户函数执行任务,但不为对象执行任务。第二个主题将未定义数量的参数转发给另一个函数提到了ReflectionClass的使用。我做了一些家庭作业,下面是使用ReflectionMethod::invokeArgs的结果。

class bzkObjectWrapperException extends Exception { }
class bzkObjectWrapper {
public $object;
public $method;
public $args; 
public function __construct($object, $method, $args = array() )  { 
$this->object = $object;
$this->method = $method;
$this->args = $args;
}
public function execute() {
$object = $this->object;
$method = $this->method;
$args   = is_array($this->args) ? $this->args : array($this->args);
$classname = get_class($object);
$reflectionMethod = new ReflectionMethod($classname, $method);
return $reflectionMethod->invokeArgs($object, $args);   
}
}

希望能有所帮助。感谢您提供第二个主题的链接。

使用func_num_args,它会给出许多函数参数。必须使用它,并像本例一样使用参数。

<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargsn";
}
foo(1, 2, 3);   
?>

相关内容

  • 没有找到相关文章

最新更新