В 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;
}
}
Они НЕ являются функционально эквивалентными.
Тип Хинтинг: Вы диктуете, какой тип должен быть передан. Если заданное значение имеет неправильный тип, генерируется ошибка. Это не приводит к преобразованию или «преобразованию» переданного значения в определенный тип.
Тип литья: Независимо от того, какое значение передано, вы «конвертируете» его в правильный тип. Если вашей функции «нужен» массив, тогда зачем пропускать логическое значение, а затем приводить его к массиву?
Кроме того, подсказка типа позволяет вам указать экземпляр объекта определенного класса. В следующих, $bar
должен быть экземпляром класса Bar
или же генерируется ошибка:
public function setBar(Bar $bar)
Вы не можете набрать переменную приведения к объекту определенного класса.
Тип подсказок из 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;
}
}