Аргументы по умолчанию php
В PHP, если у меня есть функция, написанная так:
function example($argument1, $argument2="", $argument3="")
И я могу назвать эту функцию в другом месте, как это
example($argument1)
Но если я хочу дать некоторое значение аргументу thrid,
Должен ли я это сделать
example($argument1, "", "test");
или
example($argument1, NULL, "test");
Я думаю, что оба будут работать, но что лучше? Потому что в будущем, если значение для параметра $argument2 будет изменено в основной функции, и если у меня есть "", тогда будет ли какая-нибудь проблема? Или NULL - лучший вариант?
Спасибо
Ответы
Ответ 1
Вы можете использовать либо:
example($argument1, '', 'test');
или
example($argument1, NULL, 'test');
Вы всегда можете проверить использование NULL вместо пустой строки:
if ($argument === NULL) {
//
}
Я думаю, все зависит от того, что происходит внутри функции с аргументами.
Ответ 2
Передача null
или ""
для параметра, который вы не хотите указывать, все еще приводит к тому, что эти значения null и пустые строки передаются функции.
Единственный раз, когда используется значение по умолчанию для параметра, - если параметр НЕ УСТАНАВЛСЯ ВСЕ в вызывающем коде. example('a')
будет иметь значения args # 2 и # 3, но если вы делаете example('a', null, "")
, то arg # 3 имеет значение null, а arg # 3 - это пустая строка в функции, а не значения по умолчанию.
В идеале PHP будет поддерживать что-то вроде example('a', , "")
, чтобы использовать значение по умолчанию для arg # 2, но это всего лишь синтаксическая ошибка.
Если вам нужно оставить аргументы в середине вызова функции, но указать значения для более поздних аргументов, вам нужно будет явно проверить какое-либо значение контрольной суммы в самой функции и сами установить значения по умолчанию.
Вот пример кода:
<?php
function example($a = 'a', $b = 'b', $c = 'c') {
var_dump($a);
var_dump($b);
var_dump($c);
}
и для различных входов:
example():
string(1) "a"
string(1) "b"
string(1) "c"
example('z'):
string(1) "z"
string(1) "b"
string(1) "c"
example('y', null):
string(1) "y"
NULL
string(1) "c"
example('x', "", null):
string(1) "x"
string(0) ""
NULL
Обратите внимание, что как только вы укажете ANYTHING для аргумента в вызове функции, это значение передается функции и переопределяет значение по умолчанию, которое было установлено в определении функции.
Ответ 3
Я думаю, вам будет лучше, если вы определите необязательные параметры как null
в определении функции и сохраните его таким образом, назвав их как example($argument1, NULL, $argument="test")
. Просто убедитесь, что вы используете параметры null'd в самой функции, чтобы не создавать никаких предупреждений. Вы можете использовать false
, если вы уверены, что используете этот параметр в самой функции.
Если вам кажется, что эта проблема много, лучшим способом может быть использование одного ассоциативного массива для переменных параметров:
function example($optionsIn = array()) {
$options = array(
'var1' => null,
'var2' => 'something',
'var3' => 'else'
) ;
$options = array_merge($options, $optionsIn) ;
}
$options = array(
'var2' => 'different'
) ;
example($options) ;
Таким образом, вы можете передать любые параметры функции, которые вы хотите, оставив любые другие и убедиться, что в функции есть соответствующие значения по умолчанию.
Единственным недостатком является то, что ожидаемые параметры скрыты от сигнатуры функции, но вы можете документировать их в функции docblock.
Ответ 4
Это зависит от использования функции.
function a($b=true,$c=false){
echo $b?'true':'false';
}
выполнение
a(NULL, 1);
: false. но просто a(): true
Это означает, что вам нужен аргумент по умолчанию, тогда вы должны использовать его по умолчанию:
a(true, 1);