Это кажется основным вопросом, который я знаю, но я не смог найти ответ.
Предположим, что основная функция:
function basicFunction ( $var1, $var2 = 1, $var3 = 2, $var4 = 5 ) { // Do some stuff // Return }
Теперь предположим, что я хочу вызвать эту функцию со следующими переменными:
$var1 = 0 $var2 = 1 $var3 = 2 $var4 = 3
Я могу сделать это:
$someResult = basicFunction( 0, 1, 2, 3 );
$var2
и $var3
уже установлены, так как я могу вызвать функцию без необходимости повторять значение для $var2
и $var3
?
PHP не поддерживает перегрузку. Поэтому вы не можете пропустить их каким-либо образом, если вы не переместите их справа от списка аргументов.
Обычным решением является установка значения по умолчанию другого типа, чем ожидалось (т.е. NULL). Фактическое значение по умолчанию затем устанавливается внутри функции. Этот подход не очень чист и требует некоторых дополнительных строк кода, но если ситуация требует этого, вы можете пойти с этим:
function basicFunction($var1, $var2 = NULL, $var3 = NULL, $var4 = NULL) { if ($var2 === NULL) { $var2 = 1; } // ...
К сожалению, я не думаю, что php работает так.
Если вы меняете $var4
вы должны включить $var2
и $var3
потому что они приходят до $var4
в объявлении функции.
вы можете передать массив функции со значениями по умолчанию и только изменить значение $var4
или изменить порядок в качестве предложенного nickb.
http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default
Любой способ указать дополнительные значения параметра в PHP?
Вам нужно поместить $var2
и $var3
в конец списка параметров
function basicFunction ( $var1, $var4 = 5, $var2 = 1, $var3 = 2)
Теперь вы можете позвонить:
basicFunction( 0, 3);
В противном случае вам нужно будет указать все параметры. При вызове функций вы должны указать все параметры слева направо. Единственный раз, когда вы можете пропустить параметры:
Вы думали о передаче переменных как массив в некотором роде? В этом случае вы включаете только переменные, которые необходимо обновить
function basicFunction ( $arrayvar ){ $arrayvar['var1']...
Обновление. Также вы можете использовать func_get_args()
которая работает как первая функция здесь
Я просто написал эту функцию, которая позволяет вызывать функцию ассоциативным массивом. Я тестировал его только на скалярных типах, но он должен отлично работать для функций, которые используются в ints
, floats
, ints
и booleans
. Я написал это довольно быстро, и его можно определенно улучшить несколькими способами:
function call_user_func_assoc($function, $array){ $matches = array(); $result = array(); $length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches); for($i = 0; $i < $length; $i++){ if(isset($array[$matches[3][$i]])) $result[$i] = $array[$matches[3][$i]]; else if($matches[2][$i] == 'optional') $result[$i] = eval('return ' . $matches[4][$i] . ';'); else throw new ErrorException('Missing required parameter: $' . $matches[3][$i]); } call_user_func_array($function, $result); }
Вы можете использовать его следующим образом:
function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){ var_dump(func_get_args()); } call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));
Какие результаты:
array(4) { [0]=> string(3) "Bob" [1]=> string(14) "default string" [2]=> int(2) [3]=> int(30) }
<?php function my_function( $id, $start = 0, $limit = 10, $filter = false, $include_duplicates => false, $optimize_fetch => false, $cache = false ) { if (is_array($id)) extract($id, EXTR_IF_EXISTS); /* ... */ }
А потом
<?php my_function(array('id' => 1, 'cache' => true));
Источник: http://www.marco.org/2008/11/11/faking-named-parameters-in-php
Более чистый код 4 вы (работает 100%, php> 5.3), работая с классами и функциями.
function call_user_func_assoc($function, $array){ if ((is_string($function)) && (count(explode('::',$function))>1)) $function = explode('::',$function); $func = ((is_array($function)) || (count($function)>1)) ? new ReflectionMethod($function[0], $function[1]) : new ReflectionFunction($function); foreach($func->getParameters() as $key => $param) { if (isset($array[$key])) $result[$key] = $array[$key]; elseif(isset($array[$param->name])) $result[$key] = $array[$param->name]; else $result[$key] = $param->getDefaultValue(); } return call_user_func_array($function, $result); }
пропустить значения, попробуйте вот так:
$someResult = basicFunction( 0, 0, 0, 3 );
или если u имеет значения, установленные тогда
// passing values stored in var2,var3 $var1 = 1; $var2 = 2; $someResult = basicFunction( 0, $var1, $var2, 3 );
Как я уже упоминал выше, вы всегда должны хранить необязательные переменные в правом конце, потому что аргументы php оцениваются слева направо. Однако для этого случая вы можете сделать какой-то трюк, чтобы избавиться от повторяющихся значений следующим образом:
$var2 = 1, $var3 = 2, $var4 = 5; function basicFunction($var1, $var2 = null, $var3 = null, $var4 = null) { if($var2 === null) $var2 = $GLOBALS["var2"]; if($var3 === null) $var3 = $GLOBALS["var3"]; if($var4 === null) $var4 = $GLOBALS["var4"]; }
Тем не менее, вам лучше решить эту ситуацию, переместив аргументы с умом.