Тип Подсказка против Типа Приведение в сеттеры Переполнение стека

В php мне интересно, если следующие функционально эквивалентны?

class Foo  {
public $bar;
...
public function setBar($bar)  {
$this->bar = (array)$bar;
}
}class Foo  {
public $bar;
...
public function setBar(array $bar)  {
$this->bar = $bar;
}
}

Какой из этих двух методов считается лучшим? Есть ли смысл делать и то и другое?

class Foo  {
public $bar;
...
public function setBar(array $bar)  {
$this->bar = (array)$bar;
}
}

3

Решение

Они НЕ являются функционально эквивалентными.

Тип Хинтинг: Вы диктуете, какой тип должен быть передан. Если заданное значение имеет неправильный тип, генерируется ошибка. Это не приводит к преобразованию или «преобразованию» переданного значения в определенный тип.

Тип литья: Независимо от того, какое значение передано, вы «конвертируете» его в правильный тип. Если вашей функции «нужен» массив, тогда зачем пропускать логическое значение, а затем приводить его к массиву?

Кроме того, подсказка типа позволяет вам указать экземпляр объекта определенного класса. В следующих, $bar должен быть экземпляром класса Bar или же генерируется ошибка:

public function setBar(Bar $bar)

Вы не можете набрать переменную приведения к объекту определенного класса.

8

Другие решения

Тип подсказок из PHP документов:

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

Если strict_type отключен, PHP будет пытаться привести значение, например:

function myFunction(int $bar) {
echo 'Received value: ' . $bar . ' ' . gettype($bar);
}

$foo = '12';

echo 'Passed value: ' . $foo . ' ' . gettype($foo);

myFunction($foo);

Распечатает:

Passed value: 12 string
Received value: 12 integer

В вашем случае вам не нужно использовать оба, предпочтительнее второй вариант, потому что, если это возможно, PHP попытается привести, если нет, будет вызвана ошибка.

class Foo  {
public $bar;
...
public function setBar(array $bar)  {
$this->bar = $bar;
}
}
2

По вопросам рекламы [email protected]