是否可以创建一个可以接受任意数量参数的PHP函数?

时间:2018-03-11 20:19:17

标签: php function

我正在编写一些可以从模板生成HTML文件的PHP代码。

我希望,如果可能的话,创建一个函数,它将接受函数的任何字符串,并将其放入文件中。像这样:

function generator($a, $b, $c, $n...){
$filename =  $a . ".html";
ob_start ();
echo $b;
echo $c;
echo $d;
echo $n...;
$buffer = ob_get_clean();
file_put_contents($a, $buffer);
}

我需要这个,因为不同的页面会包含不同数量的包含文件,因此我可以跳过为特定页面制作不同的功能。只是一个迭代器,就是它。

谢谢!

5 个答案:

答案 0 :(得分:6)

从PHP 5.6+开始,您可以使用...来表示可变数量的参数:

function test (... $args)
{
    foreach ($args as $arg) {
        echo $arg;
    }
}

test("testing", "variable"); // testing variable

所以,你的函数看起来像这样:

function generator($a, $b, $c, ... $n) {
    $filename =  $a . ".html";
    ob_start();

    echo $b;
    echo $c;

    foreach ($n as $var) {
        echo $var;
    }

    $buffer = ob_get_clean();
    file_put_contents($a, $buffer);
}

答案 1 :(得分:2)

您还可以使用variadic functions (PHP 5.6+)

function generator($a, ...$args) {
    echo $a . "\n";
    print_r($args);
}

generator("test", 1, 2, 3, 4);

输出:

"test"
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

答案 2 :(得分:1)

只需在函数内使用func_get_args();即可返回传入的所有参数的数组。

您还可以使用func_get_arg($arg_num)返回特定参数,或使用func_num_args返回参数数量。

所有PHP函数都允许任意数量的参数,它们只是不能按名称调用,唯一的方法是使用这3个函数。

注意,您可以使用可变参数作为参数列表中的最后一个参数:

function my_func($x,$y, ... $z){
    //Now $z is an array of all arguments after the first two
}

答案 3 :(得分:1)

您可以使用数组进行以下操作:

function generator($array){
    // set the first item of the array as name of the .html file and take it out of the array.
  $filename = array_shift($array) . ".html";
  ob_start ();
  // echo all the array fields
  foreach($array as $a){
    echo $a;
  }
  $buffer = ob_get_clean();
  file_put_contents($a, $buffer);
}

您可以直接传递数组以调用函数,如下所示:

generator( ["val_1", "val_2", "val_3"] );

答案 4 :(得分:1)

在设计良好的过程中,我会仔细考虑何时何地使用此类内容。例如,我目前正在处理一个可能有超过200K行代码的项目,更糟糕的是,这实际上从未使用过。

最常见的方法是传递数组" struct"方法:

$args = array();
$args['kitchen'] = 'sink';
$args['bath'] = 'room';
$args['cat'] = array('fur','tail');

$func->someFunction($args);

如果您想要更多地控制数据,可以创建一个结构并在类中访问它。公共职能充当处理者。

class SomeClass {
  ....
  private $args

  public function setArgs($arg1,$arg2,$arg3) {
      $this->arg1 = $arg1;
      ...
  }
  public function getArgs() {
      return $this->args;
  }

更少见的是你可以使用C ++之类的控件,只使用类作为结构:

class MyStruct {
    public $foo;
    public $bar;
    private $secret;
    private function getSecret() {
        return $secret;
    }
    protect function setSecret($val) {
        $secret = $val;
    }
}

已经提到过' ...'我几乎从未见过,但它有趣,虽然有用吗?这有助于解释发生了什么吗?

  function someFunction(... $args)

通常,您会在方法中看到各种各样的东西,这些方法有助于阐明其目的。

private function someSmallFunc($list = array(), $val = '', $limit = 10)

这个例子是为了说明信息的自然分组,数据在列表中,$ val用于控制方法的内容以及$ limit表示限制查询结果的数量。因此,您应该以这种方式思考您的方法IMO。

此外,如果您注意到默认值已设置($ limit = 10)以防它们未被传入。例如,如果您调用someSmallFunc($ data,$ someVal)(反对someSmallFunc($ data) ,$ someVal,20))并且没有传入$ limit它将默认为10.