是否可以在 PHP 函数中使用数组作为默认参数?
我想做以下事情:
$arr = array(1,2,3,4);
function sample($var1, $var2, $var3 = $arr){
echo $var1.$var2;
print_r($var3);
}
sample('a','b');
// Should still work without the third parameter and default to $arr
不,这是不可能的,默认值的右手表达式必须是常量或数组字面量,即
function sample($var1, $var2, $var3 = array(1, 2, 3, 4))
{
}
如果你想要这种行为,你可以使用闭包:
$arr = array(1, 2, 3, 4);
$sample = function ($var1, $var2, array $var3 = null) use ($arr) {
if (is_null($var3)) {
$var3 = $arr;
}
// your code
}
$sample('a', 'b');
你也可以用一个类来表达它:
class Foo
{
private static $arr = array(1, 2, 3, 4);
public static function bar($var1, $var2, array $var3 = null)
{
if (is_null($var3)) {
$var3 = self::$arr;
}
// your code here
}
}
Foo::bar('a', 'b');
你不能传入$arr
函数定义,你必须这样做:
function sample($var1, $var2, $var3 = array('test')){
echo $var1.$var2;
echo print_r($var3);
}
sample('a','b'); // output: abArray ( [0] => test ) 1
或者,如果你想变得很脏(我不推荐它..):
$arr = array('test');
function sample($var1, $var2, $var3 = null){
if($var3 == null){
global $arr;
$var3 = $arr;
}
echo $var1.$var2;
echo print_r($var3);
}
sample('a','b');
(这可能不是一个完整的答案,但它涵盖了一些有用的案例。)
如果您想使用数组作为函数(或方法)中的参数来获取一个或多个选项,则设置一组默认选项可能无济于事。相反,您可以使用array_replace()
.
例如,让我们考虑一个示例$options
参数,它获取一个包含两个键的数组,count
并且title
. 为该参数设置默认值会导致在使用$option
传递任何自定义值的函数时覆盖它。在示例中,如果我们设置$options
为只有一个count
键,则该title
键将被删除。正确的解决方案之一如下:
function someCoolFunc($options = []) {
$options = array_replace([
"count" => 144,
"title" => "test"
], $options);
// ...
}
在上面的示例中,即使用户提供了一个空数组,也可以确保存在count
和索引(请记住,函数中参数的顺序很重要)。title
array_replace()
注意:在解释的情况下,使用类(或接口)也是一种选择,但选择数组而不是它的一个原因可能是简单性(甚至是性能)。
我尝试了上面的最后一个示例。这是我的可比测试:
function someFunc($options = [])
{
$options = array_replace([
"<br>", "<b>", "<i>", "<u>", "<hr>", "<span>"
], $options);
print_r($options);
}
结果如下:
>>> somefunc()
Array
(
[0] => <br>
[1] => <b>
[2] => <i>
[3] => <u>
[4] => <hr>
[5] => <span>
)
=> null
然而,看看当您尝试添加标签时会发生什么。注意原始值会发生什么。元素 [0] 已更改。该数组未添加到:
>>> someFunc(["<div>"])
Array
(
[0] => <div>
[1] => <b>
[2] => <i>
[3] => <u>
[4] => <hr>
[5] => <span>
)
=> null
这将允许您将元素添加到默认选项:
function someFunc($options = array())
{
array_push($options, "<br>", "<b>", "<i>", "<u>", "<hr>", "<span>");
return $options;
}
结果如下:
>>> someFunc()
=> [
"<br>",
"<b>",
"<i>",
"<u>",
"<hr>",
"<span>",
]
---
someFunc(["<div>","<table>"]);
=> [
"<div>",
"<table>",
"<br>",
"<b>",
"<i>",
"<u>",
"<hr>",
"<span>",
]
这样,默认值被添加到。