Есть ли чистый способ использовать неопределенные переменные в качестве дополнительных параметров в PHP? - PullRequest
0 голосов
/ 07 мая 2020

Есть ли хороший способ использовать (потенциально) неопределенные переменные (например, из внешнего ввода) в качестве необязательных параметров функции?

<?php
$a = 1;

function foo($a, $b=2){
    //do stuff
    echo $a, $b;
}

foo($a, $b); //notice $b is undefined, optional value does not get used.
//output: 1

//this is even worse as other erros are also suppressed
@foo($a, $b); //output: 1

//this also does not work since $b is now explicitly declared as "null" and therefore the default value does not get used
$b ??= null;
foo($a,$b); //output: 1

//very,very ugly hack, but working:
$r = new ReflectionFunction('foo');
$b = $r->getParameters()[1]->getDefaultValue(); //still would have to check if $b is already set
foo($a,$b); //output: 12

единственный полу-полезный метод, о котором я могу думать до сих пор, - это не определение значения по умолчанию в качестве параметра, но внутри фактической функции и использование «null» в качестве посредника, например:

<?php
function bar ($c, $d=null){
    $d ??= 4;
    echo $c,$d;
}

$c = 3
$d ??= null;
bar($c,$d); //output: 34

Но, используя это, мне все равно придется дважды проверить параметр: один раз, если он установлен перед вызовом функция и один раз, если она равна нулю внутри функции.

Есть еще какое-нибудь приятное решение?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

В идеале вы бы не прошли $b в этом сценарии. Я не помню, чтобы когда-либо сталкивался с ситуацией, когда я не знал, существует ли переменная и все равно передавал ее функции:

foo($a);

Но для этого вам нужно было бы определить, как вызвать function:

isset($b) ? foo($a, $b) : foo($a);

Это своего рода хакер sh, но если вам все равно нужна ссылка, она будет создана:

function foo($a, &$b){
    $b = $b ?? 4;
    var_dump($b);
}

$a = 1;
foo($a, $b);
0 голосов
/ 07 мая 2020

Я бы сделал что-то подобное, если бы это было действительно требованием. Просто тестирование с суммой предоставленных значений только для демонстрации примера.

<?php
$x = 1;

//Would generate notices but no error about $y and t    
//Therefore I'm using @ to suppress these
@$sum = foo($x,$y,4,3,t);  
echo 'Sum = ' . $sum;

function foo(... $arr) {
    return array_sum($arr);
}

Будет выводить ...

Sum = 8

... на основе заданного массива (неизвестное количество аргументов with ... $ arr)

array (size=5)
  0 => int 1
  1 => null
  2 => int 4
  3 => int 3
  4 => string 't' (length=1)

array_sum() суммирует только 1,4 и 3 здесь = 8.


Даже если это действительно работает, я бы не рекомендовал его , потому что тогда любые данные могут быть отправлены в вашу функцию foo() без вашего контроля. Когда дело доходит до пользовательского ввода любого вида, вы всегда должны проверять как можно больше в своем коде, прежде чем использовать фактические данные от пользователя.

...