【问题标题】:Specifying Optional and Multiple Values in a Function Parameter在函数参数中指定可选值和多个值
【发布时间】:2014-04-03 08:35:31
【问题描述】:

我想创建一个可以在参数中接受多个、可选和附加值的函数。

比如我想上课

class Pizza {
   public function addToppings($additional_toppings) 
   {
   }
}

我可以在我的程序中用作

$pizza1=new Pizza;
$pizza1->addToppings(SALAMI + HAM + BACON + ADDITIONAL_CHEESE);

$pizza2=new Pizza;
$pizza2->addToppings(HAM + PINEAPPLE + SAUSAGE);

浇头可以是任意组合,并且主题的选择属于预定义的集合。

如何实现 addToppings 函数?

我似乎记得在 PHP 中看到过类似的东西,但我不记得是哪个。

另一方面,您会推荐关联数组吗?

$pizza1->addToppings(array('salami','ham','bacon','additional_cheese'));
$pizza2->addToppings(array('ham','pineapple','sausage'));

这个选项似乎更简单,但我想知道你会选择哪些想法以及为什么。谢谢

编辑:

我现在记得有一个这样的 PHP 实现。

error_reporting 函数允许指定多个相加的error level constants 作为参数,例如:

error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

那么是否只允许 error_reporting() 的实现,因为它是 PHP 的一部分,但不能以其他方式重新创建?

【问题讨论】:

  • 唯一的方法确实是一个数组。 PHP 没有像 Java 或 Ruby 这样的无限参数输入。编辑:好的,实际上有一种方法; func_get_args()。但是,关联数组似乎仍然是更好的选择
  • 谢谢格本。但是为什么它必须是关联的而不是像我的示例那样简单的索引数组?
  • error_reporting 函数仍然只接受一个参数,我已经更新了我的答案来解释更多。
  • 可以是索引数组。我输入的时候只是在想简单的字符串。

标签: php function optional-parameters


【解决方案1】:

您可以按照您建议的方式进行操作,传递一个数组,我个人的偏好是这样做。但是 PHP 确实支持可变参数列表。

见:http://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list

使用可变参数,您可以使用func_num_args()func_get_args() 函数。

这是一个例子:

<?php

addToppings('Cheese', 'Ham', 'Peppers');

function addToppings()
{
    echo "Added " . func_num_args() . " toppings<br />";
    var_dump(func_get_args());
}

?>

编辑以包括对关于error_reporting() 功能的 OP 编辑​​的回复

error_reporting() 函数仍然只接受一个参数,错误常量之间的管道符号是bitwise operator,因此它们计算为一个值。您可能会为您的函数实现类似的东西,但与比萨饼类比似乎并不实用。

有关按位运算的更多信息,请访问Wikipedia

【讨论】:

  • 坏主意。你应该避免这样的定义——因为它不可读并且使函数定义模棱两可
  • 是的,我声明我更喜欢传递一个数组,但是问题是问是否有替代方案,我只是提供了它。你认为这是一个坏主意的理由是完全正确的,我同意 100% +1
  • 感谢 AJReading。您还帮助区分了在一个参数中具有多个值(您建议的数组)和具有由 func_get_args 检索的多个可变参数。我们在设计函数时需要考虑的一个有用的区别。
  • 感谢您对 error_reporting 的澄清。不知何故,我错过了这一点,实际上发现按位运算符非常复杂(根据我的口味)。将坚持数组输入建议
猜你喜欢
  • 2014-03-09
  • 2011-05-01
  • 2014-01-27
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多