参数数量不限的PHP函数
如何编写一个可以接受无限数量参数的函数 我试图做的是在一个类中创建一个函数,该函数包含以下内容:参数数量不限的PHP函数,php,arguments,Php,Arguments,如何编写一个可以接受无限数量参数的函数 我试图做的是在一个类中创建一个函数,该函数包含以下内容: $stmt->bind_param('sssd', $code, $language, $official, $percent); 你看过了吗 例如: function foo(){ if ( func_num_args() > 0 ){ var_dump(func_get_args()); } } 或: 与使用func_get_args相比,我更喜欢
$stmt->bind_param('sssd', $code, $language, $official, $percent);
你看过了吗
例如:
function foo(){
if ( func_num_args() > 0 ){
var_dump(func_get_args());
}
}
或:
与使用func_get_args相比,我更喜欢使用func_get_args,因为代码可能更可读,更重要的是,由于缺少格式变量,不太可能导致错误。有一个名为的函数,它是传递给该函数的所有参数的数组 来自PHP.net的示例
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1, 2, 3);
函数foo()
{
$numargs=func_num_args();
echo“参数数量:$numargs
\n”;
如果($numargs>=2){
echo“第二个参数是:”.func\u get\u arg(1)。“
\n”;
}
$arg_list=func_get_args();
对于($i=0;$i<$numargs;$i++){
echo“参数$i为:”.$arg_列表[$i]。“
\n”;
}
}
foo(1,2,3);
上述示例将输出:
参数数量:3第二个论点是:2
参数0是:1
论点1是:2
论点2是:3使用:
以上建议都很好,但我认为它们不适合你的情况
$stmt->bind_param('sssd', $code, $language, $official, $percent);
如果要包装此函数,需要将对原始参数变量的引用传递给bind_param函数。我不认为func_get_args()提供了这个,而是提供了值。因此,不可能使用这些函数传递给父函数。在尝试扩展mysqli_stmt时,我遇到了类似的问题,但始终没有找到令人满意的解决方案
恐怕这并不是对您问题的真正回答,只是警告您,其他参数可能无法在任意数量的参数的特定应用程序中工作。在5个参数下,此设计开始显示反模式“”。这意味着重构被称为对象或结构,其中的数据成员表示要传入的参数。但是,要避免让它成为一个错误
另请参见refactoring.com上的重构。对于非引用参数,使用func_get_args()的答案可以很好地使用。 然而,有一个技巧可以通过引用参数来进行传递。 而且,从技术上讲,它不是一个接受无限参数的函数,而是一个任意大的数,比如说100 您可以做的是定义一个接受大量参数的函数,并将它们默认为null。 然后,在该函数内部,将每个非空引用附加到一个数组,然后使用*call_user_func_array()*调用*bind_param()* 真正的诀窍是,你不想手写这东西。 只需编写另一个脚本,将这个函数的主体输出为*my_bind_param_body.php*。 然后,只需在主文件中定义函数的头,并将主体包含到该函数定义中。 i、 e
以前您应该使用
func\u get\u args()
,但在PHP5.6中,您可以使用
例如,您可以编写一个函数,返回发送给函数的所有数字的总和:
function bind_param(...$params){
var_dump($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);
?>
<?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);
?>
如果您使用的是PHP版本
我经常使用func\u get\u参数。它很难一目了然地看到方法的输入是什么。另外,它在代码中引入了一段难看的语法。我建议这种方法只是作为最后的手段。我更喜欢参数对象重构。我同意你的观点,这是一种处理变量参数的糟糕方法。我在回答中添加了另一个想法,我更喜欢“链接函数”的建议,而不是func_get_args。我知道这个设计是一个流畅的界面。它通过使用bindString()、bindDecimal()等来完成。将“return$this;”作为它们的最后一行。FLUENT界面对于cetain类型的工厂来说是一个很好的选择。上次我检查时(1年多以前),没有办法包装/扩展bind_param()
,因为func_get_args()
不会返回引用。如果参数未设置,然后通过引用传递,将在函数内部设置,则这不起作用。func_get_args尝试访问引发错误的unset变量。如果不付出一些努力,您将无法做到这一点。我建议您以通常的方式构建查询,或者如果您希望不惜任何代价使用本机准备的语句,那么就转到PDO。他们有自己的价值,注意你想要的信息。不幸的是,与我自己编写简单的东西相比,PDO似乎有点过头了,需要更多的努力和样板。对于简单的东西,你可以使用我的userinfo中的库。不过很简单。
function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...)
{
$vars = array($types);
$vars[] = $arg1;
if ($arg2 != null)
$vars[] = &$arg2;
if ($arg3 != null)
$vars[] = &$arg3;
...
if (!call_user_func_array(array($stmt, "bind_param"), $vars))
{
if ($stmt->errno == 0)
return array(-1, "Unknown error binding parameters.");
else
return array(-1, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error);
}
return array(0, "");
}
function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...)
{
return include "my_bind_param_wrapper_body.php";
}
function bind_param(...$params){
var_dump($params);
}
<?php
function sum(...$numbers) {
$sum = 0;
foreach ($numbers as $n) {
$sum += $n;
}
return $sum ;
}
echo sum(1, 2, 3, 4, 5);
?>
<?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);
?>