如何编写可以接受无限数量参数的函数?
我想要做的是在一个包含以下内容的类中创建一个函数:
$stmt->bind_param('sssd', $code, $language, $official, $percent);
Run Code Online (Sandbox Code Playgroud)
Yac*_*oby 23
你看过func_get_args,func_get_arg和func_num_args了吗?
例如:
function foo(){
if ( func_num_args() > 0 ){
var_dump(func_get_args());
}
}
Run Code Online (Sandbox Code Playgroud)
要么:
function bind_param(){
if ( func_num_args() <= 1 ){
return false; //not enough args
}
$format = func_get_arg(0)
$args = array_slice(func_get_args(), 1)
//etc
}
Run Code Online (Sandbox Code Playgroud)
编辑
关于Ewan Todds评论:
我没有任何关于你正在创建包装的基础API的知识,但另一种选择可能是用链接函数做一些事情,所以你的结果界面看起来像:
$var->bind()->bindString($code)
->bindString($language)
->bindString($official)
->bindDecimal($percent);
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用func_get_args作为代码可能更具可读性,更重要的是由于缺少格式变量而不太可能导致错误.
Sal*_*ali 13
以前你应该使用func_get_args()
,但在PHP 5.6中,你可以使用...运算符.
因此,例如,您可以编写函数,该函数返回发送给函数的所有数字的总和:
function bind_param(...$params){
var_dump($params);
}
Run Code Online (Sandbox Code Playgroud)
你params
实际上是所有元素的数组.
如果您使用的是 PHP 5.6 或更高版本,参数列表可能包含...
标记以表示该函数接受可变数量的参数。参数将作为数组传递给给定的变量;简单地使用...
您可以访问无限的变量参数。
例如:
<?php
function sum(...$numbers) {
$sum = 0;
foreach ($numbers as $n) {
$sum += $n;
}
return $sum ;
}
echo sum(1, 2, 3, 4, 5);
?>
Run Code Online (Sandbox Code Playgroud)
如果您使用的是PHP 版本 <= 5.5,那么您可以使用func_num_args()、func_get_arg()和func_get_args()函数访问无限参数。
例如:
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs \n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "\n";
}
}
foo(1, 2, 3);
?>
Run Code Online (Sandbox Code Playgroud)
function my_func() {
$args = func_get_args();
foreach ($args as $arg) {
echo "Arg: $arg\n";
}
}
Run Code Online (Sandbox Code Playgroud)
小智 4
以上建议都不错,但我认为它们不适合您的情况。
$stmt->bind_param('sssd', $code, $language, $official, $percent);
Run Code Online (Sandbox Code Playgroud)
如果要包装此函数,则需要将对原始参数变量的引用传递给bind_param函数。我不认为 func_get_args() 给你这个,它给你值。因此不可能使用它们传递给父函数。在尝试扩展 mysqli_stmt 时,我遇到了类似的问题,但从未找到令人满意的解决方案。
恐怕这并不是对您问题的真正答案,只是警告其他参数可能不适用于您任意数量参数的特定应用。