Использование массива в качестве параметра по умолчанию в функции PHP
Можно ли использовать массив в качестве параметра по умолчанию в функции PHP?
Я хотел бы сделать следующее:
$arr = array(1,2,3,4);
function sample($var1, $var2, $var3 = $arr){
echo $var1.$var2;
echo print_r($var3);
}
sample('a','b');
// Should still work without the third parameter and default to $arr
Ответы
Ответ 1
Нет, это невозможно, правильное выражение значения по умолчанию должно быть константным или массивным литералом, то есть
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');
Ответ 2
Вы не можете передать $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');
Ответ 3
(Это может быть не полный ответ, но он охватывает некоторые полезные случаи.) Если вы хотите получить один или несколько параметров, используя массив в качестве аргумента в функции (или метод), установка набора параметров по умолчанию может не помочь, Вместо этого вы можете использовать array_replace()
.
Например, давайте рассмотрим пример аргумента $options
который получает массив с двумя ключами, count
и title
. Установка значения по умолчанию для этого аргумента приводит к его переопределению при использовании функции с любым переданным значением пользовательской $option
. В этом примере, если мы установим в $options
только один ключ count
ключ title
будет удален. Одним из правильных решений является следующее:
function someCoolFunc($options = []) {
$options = array_replace([
"count" => 144,
"title" => "test"
], $options);
// Remained code...
}
В приведенном выше примере вы будете уверены, что индексы count
и title
присутствуют, даже если пользователь предоставляет пустой массив (имейте в виду, что порядок аргументов в функции array_replace()
важен).