Необязательный параметр PHP - PullRequest
       58

Необязательный параметр PHP

0 голосов
/ 20 сентября 2019

Я немного запутался по поводу необязательных параметров или установки параметра в функции в целом.Итак, я нашел этот пример:

<?php
function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>

, и я не понимаю, почему эхо makecoffe ("эспрессо") возвращает эспрессо, а не капучино.Не перезаписать ли эспрессо при вызове метода?В моей голове $type сначала будет эспрессо, но затем будет установлено значение капучино, поскольку это происходит после вызова метода.Трудно объяснить, что я имею в виду, но вызывается ли $type = "cappuccino" только тогда, когда нет параметров или почему это происходит?То же самое с

function makecoffee($type = null)
    {
}

echo makecoffe("espresso");

, почему бы при этом возвращать эспрессо, а не ноль, даже если для типа при вызове функции будет установлено значение null?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Хорошим примером для информирования вас о том, как именно работают параметры php в функциях, будет func_get_args(), который возвращает все переданные аргументы функции.

И это будет наш пример функции.

function foo($example = 'default')
{
    print_r(func_get_args());
}

Теперь мы можем проверить, был ли передан какой-либо аргумент в функцию.

Что произойдет, если мы не передадим какой-либо аргумент?

foo();

// Output
Array
(
)

Мы знаем, что функция была вызвана без какого-либоаргумент, потому что выходной массив пуст.И это тот момент, когда значение по умолчанию используется для нашего параметра функции.Итак, в конечном итоге значение параметра $example будет равно 'default'

Теперь мы попытаемся передать 2 аргумента функции.

foo('example', 'unnecessary');

// Output
Array
(
    [0] => example
    [1] => unnecessary
)

Из этого примера мы можем сделать вывод, чтоможет передавать любое количество аргументов, не видя исключения.Это одна из особенностей php.

Но что было передано параметру $example?

Как сообщает php docs .

аргументы вычисляются слева направо.

Левая сторона для нашего примера - это значение из массива с индексом 0, а правая сторона - последний элемент с (фактически индекс 1)

Итак, под $example мы имеем 'example' значение.

В значениях по умолчанию второй аргумент будет игнорироваться, потому что наша функция не имеет соответствующего второго параметра.

Что если мы передадим null в качестве аргумента?

Этоможет быть сложно, потому что мы можем представить, что функция, вызываемая с null в качестве аргумента, будет влиять на нашу функцию как функцию, вызываемую без каких-либо аргументов.

Ничего более неправильного.

foo(null);

// Output
Array
(
    [0] =>
)

Теперь выдолжен увидеть это.Несмотря на то, что наш аргумент был null, значение было передано нашей функции и перезаписано значение по умолчанию 'example' для параметра.Наконец, параметр $example будет равен null.

0 голосов
/ 20 сентября 2019

Это потому, что бит $param = 'value' в объявлении функции не выполняется каждый раз, когда вызывается функция.

Он вступает в действие только в том случае, если вы не передаете значение для этого параметра.

Вместо того, чтобы читать его как буквальное присваивание, PHP делает что-то вроде следующего под капотом всякий раз, когда входит в вашу функцию.

if true === $param holds no value
    $param = 'value'
endif

Другими словами, $param = 'value' не является буквальным выражениемв контексте языка, а скорее в языковой конструкции, определяющей желаемое поведение реализации резервных значений по умолчанию.

Редактировать: Обратите внимание, что приведенный выше фрагмент намеренно является просто псевдокодом, так как это сложноточно выразить, что происходит с использованием PHP после его компиляции.Смотрите комментарии для получения дополнительной информации.

...