Добрый день. Есть функция:
function lol($a = 1, $b = 2, $c = 3) {
{
Как можно вызвать эту функцию, изменив только 3ий аргумент, без указания 1го и 2го? Дабы не писать подобный код: lol(1,2,4)
Просто есть функции с длинными дефолтными аргументами, и ищу способ как их не указать.
Update: постараюсь сформулировать понятнее. Допустим в функции, по стандарту аргументы $a = 123456789, $b = 123
Как мне вызвать lol($b = 321)
пропустив, и не указав $a
? (т.к. оно длинное)
function lol($a = 1, $b = 2, $c = 3) {}
Как мне вызвать lol($b = 321)
пропустив, и не указав $a
?
Никак.
Описание и все способы передачи аргументов
А задать туда NULL
или 0
подойдет? Вы можете задать (0,0,4)
, коротко и сразу видно что нули не заданы. В функции проверка заданы или нет.
Взятый из английского ресурса StackOverflow:
function foo($blah, $x = null, $y = null) {
if (null === $x) {
$x = "some value";
}
if (null === $y) {
$y = "some other value";
}
code here!
}
Но вызывать все так же нужно с определенным кол-вом параметров.
foo('blah', null, 'non-default y value');
Где можно задать значения, а можно оставить по умолчанию, как второй параметр тут.
Как Вам уже говорили:
function lol($a=null,$b=null,$c=null){
$a=!empty($a)?$a:123456789;
$b=!empty($b)?$b:123;
$c=!empty($c)?$c:1;
}
Вызывать так: lol(null,345)
В PHP 5.6+ появилось Переменное количество аргументов
Вы можете определить функцию с одним аргументом-массивом, а вызывать, передавая массив вместо параметров. Это самый простой способ эмуляции именнованных параметров.
Пример:
function f($options) {
extract($options); // добавить элементы массива в текущую область видимости
echo $c;
}
Использование:
f(['c' => 42]); // передаст в функцию число 42
Для удобства применяется функция export, чтобы в одну строчку извлечь содержимое массива в текущую область видимости. Возможно, вы решите, что это способ порождает слишком много ошибок, если тщательно не документировать ваш код. В таком случае, можете выполнять присваивания вашим локальным переменным вручную или напрямую использовать элементы переданного массива, если функция небольшая.
В любом случае надо знать меру и не забывать о читаемости кода.
Один из вариантов, фасадировать функцию:
function lol($a = 1, $b = 2, $c = 3) {}
function lolС($c = 3) {return lol(1, 2, $c);}
Значимыми параметрами по умолчанию, вообще говоря, злоупотреблять не стоит.
В любом случае, имеет смысл замена магических чисел константами с осмысленными именами:
class A {
const DEF_A = 1;
const DEF_B = 2;
function lol($a = self::DEF_A, $b = self::DEF_B) {}
}
тогда проблема передачи значений по умолчанию исчезает:
$a->lol(A::DEF_A, 3);
Ну и стандартное решение - самостоятельная реализация значений по умолчанию:
function lol($a = null, $b = null) {
$a = $a ?? 1; // php7 coalesce syntax
$b = $b ?? 2;
}
lol(null, 3);
Да, можно существенно сократить сигнатуру пользовательской функции, если использовать в качестве передаваемого аргумента ассоциативный массив, ключи которого будут именованы в соответствии с переменными из тела фунции. Звучит немного запутано, поэтому публикую поясняющий пример:
// Вызов с параметрами по умолчанию
foo();
// Вызов с любым параметром (остальные по умолчанию)
foo(['b' => 'Новый параметр']);
// Вызов со всеми новыми параметрами
foo(['a' => 'Значение 1', 'b' => 'Значение 2', 'c' => 'Значение 3']);
function foo() {
// Массив параметров по умолчанию
$args = [
'a' => 123456789,
'b' => 123,
'c' => 3
];
extract($args);
foreach (func_get_args() as $array) {
extract($array);
}
// И далее работаете с переменными $a, $b, $c
echo '<pre>', var_dump($a, $b, $c), '</pre>';
}
Результаты:
int(123456789)
int(123)
int(3)
int(123456789)
string(27) "Новый параметр"
int(3)
string(18) "Значение 1"
string(18) "Значение 2"
string(18) "Значение 3"
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
При создании куки с сервера и клиента, они, если посмотреть в отладчике, сохраняются для разных доменовРазница в них лишь в точке перед именем,...
Добрый день, пожалуйста, помогите, пользуюсь библиотекой cURL (PHP), есть запрос к серверу ВКонтакте URL ($url ):