Подтвердить что ты не робот

Аргументы по умолчанию php

В PHP, если у меня есть функция, написанная так:

function example($argument1, $argument2="", $argument3="")

И я могу назвать эту функцию в другом месте, как это

example($argument1)

Но если я хочу дать некоторое значение аргументу thrid, Должен ли я это сделать

example($argument1, "", "test");

или

 example($argument1, NULL, "test");

Я думаю, что оба будут работать, но что лучше? Потому что в будущем, если значение для параметра $argument2 будет изменено в основной функции, и если у меня есть "", тогда будет ли какая-нибудь проблема? Или NULL - лучший вариант?

Спасибо

4b9b3361

Ответ 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);