Как преобразовать обнуляемую переменную в не обнуляемый тип? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть функция, которая получит параметр ?string

public function func(?string $x): string
{
    $x = trim(strtolower($x));
    $x = preg_replace('/\s+/', ' ', $x);
    $x = str_replace(' ', '-', $x);
    return $x;
}

, работающий ./vendor/bin/phpstan analyse, выдаст эти ошибки:

Parameter #1 $str of function strtolower expects string, string|null given.              
Parameter #3 $subject of function preg_replace expects array|string, string|null given.  
Parameter #3 $subject of function str_replace expects array|string, string|null given.   

strtolower, потребности string и preg_replace& str_replace нужно array|string

как лучше всего решить эту проблему без изменения параметра с ?string $x на string $x?
другими словами, как изменить тип переменной с string|null на string?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Хотя PHP может преобразовывать ноль в пустую строку с помощью приведения, вы действительно должны спросить себя, почему эта функция вообще должна принимать нулевое значение.

Если ноль означает, что у вас есть какое-то значение по умолчанию для$x, тогда это кажется совершенно логичным, и вы можете использовать нулевое объединение, чтобы сделать $x строковым значением по умолчанию, если $x равно нулю.

$x = $x ?? 'default';

Однако вышеупомянутое может быть более эффективно разрешеноопределив «default» в сигнатуре:

function func(string $x = 'default')

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

0 голосов
/ 24 февраля 2019

Я полагаю, что вы можете указать свое значение $x,

, например:

function foo(?string $x) : string {
    $a = (string) $x;

    return $a;
}

Это должно дать

var_dump(foo("test"));

string(4) "test"

И,

var_dump(foo(null));

string(0) ""

Надеюсь, это то, что вы искали.

...