可能重复:
Unlimited arguments for PHP function?
Forward undefined number of arguments to another function
我正在设置一个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(),但我宁愿避免使用它。
你知道如何将参数传递给函数吗?
修改
此主题已被关闭,因为它是2个较旧主题的副本。第一个是关于call_user_func_array()函数,它可以完成用户函数的工作,但不能用于对象。第二个主题Forward undefined number of arguments to another function提到了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);
}
}
希望它可以提供帮助。并感谢第二个主题的链接。
答案 0 :(得分:1)
使用func_num_args
它会给出一些函数参数。只需使用它并使用这个例子中的参数。
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs\n";
}
foo(1, 2, 3);
?>