可能重复:
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);
?>