所以我想使用call_user_func
将数据传递给函数的可选参数。
以下是代码示例,可选参数$data
表示在另一个文件中声明的名为data
的函数。我只是想通过使用call_user_func
来调用它,它将使用函数的名称设置参数并在createtable函数中调用它,但似乎不起作用。
我从PHP手册中得到了示例,但createTable
包含许多参数。如何call_user_func
仅将字符串data
分配给默认设置为$data
的可选参数NULL
?
function createTable($database, $table, $patch,$data = NULL)
{
echo "INFO: Adding '$table'in database '$database'.\n";
$sql = "SHOW TABLES FROM $database WHERE Tables_in_$database='$table';";
$result = mysql_query($sql);
$result_count = mysql_num_rows($result);
if ( $result_count != 1 ) {
echo "ERROR: Can not find table '$table' in database '$database'.\n";
$result = mysql_query($patch);
if ( false === $result ) {
echo "ERROR: Adding Table '$table' in database '$database' ... Failed\n";
return false;
}
else {
echo "INFO: Adding Table '$table'in database '$database' ... Success\n";
// using the optional parameter here
$data();
return true;
}
} else {
if ( $result_count == 1 ) {
echo "ERROR: Table '$table'already in database '$database'.\n";
return false;
}
}
}
// Now I'm passing value to the optional parameter $ data that is NULL as default.
call_user_func('createTable', "data");
答案 0 :(得分:1)
即使使用call_user_func
,您也必须传递所有参数。
无论如何,call_user_func
旨在在事先不知道函数名称时使用。例如,您可能有多个函数和一个变量,该变量包含要调用的函数的名称。
就我个人而言,我认为它与eval
和变量变量相同:一个可怕的想法。毕竟,如果您有$foo = "function_name";
,则可以致电$foo()
,然后拨打function_name
。
无论如何,回到这一点,只需将其称为普通函数,并为其提供所需的参数。如果有必要,请通过null
。
答案 1 :(得分:0)
你必须传递像这样的价值
call_user_func('createTable', $database, $table, $patch,$data);
或来自班级
的电话call_user_func(array(&$objectName->{$anotherObject},$functionName), $arg1, $arg2, $arg2);
或者你可以使用它可以将arg作为数组
call_user_func_array("createTable", array("one", "two"));
或者这个来自类的调用可以将arg作为数组
call_user_func_array(array($foo, "bar"), array("three", "four"));
或者这也可以帮助你,不需要传递所有的参数
function __named($method, array $args = array())
{
$reflection = new ReflectionFunction( $method);
$pass = array();
foreach($reflection->getParameters() as $param)
{
/* @var $param ReflectionParameter */
if(isset($args[$param->getName()]))
{
$pass[] = $args[$param->getName()];
}
else
{
try{
$pass[] = $param->getDefaultValue();
}catch(Exception $e){
$pass[] = NULL;
}
}
}
return $reflection->invokeArgs( $pass);
}
我希望它有用
样品:
__named('createTable', array('data' => 'value'));
它适用于课程
public function __named($method, array $args = array())
{
$reflection = new ReflectionMethod($this, $method);
$pass = array();
foreach($reflection->getParameters() as $param)
{
/* @var $param ReflectionParameter */
if(isset($args[$param->getName()]))
{
$pass[] = $args[$param->getName()];
}
else
{
try{
$pass[] = $param->getDefaultValue();
}catch(Exception $e){
$pass[] = NULL;
}
}
}
return $reflection->invokeArgs($this,$pass);
}
如果你没有设置任何值__named Put Null而不是Unset Value
答案 2 :(得分:0)
看起来你只想传递最后一个参数,而不用担心前三个。我认为call_user_func
在这里根本不是正确的工具。
为什么不只是创建一个调用函数的函数?
function call_createTable($data){
$database = '...';
$table = '...';
$patch = '...';
return createTable($database, $table, $patch, $data);
}
然后只需将其称为:call_createTable("data");
。