在setter php中输入Hinting vs Type Casting

时间:2016-12-08 18:43:17

标签: php casting setter type-hinting

在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;
    }
}

2 个答案:

答案 0 :(得分:8)

它们在功能上并不相同。

类型提示:您正在规定必须传递的类型。如果给定值的类型不正确,则会生成错误。这不会转换或转换"将传递的值转换为特定类型。

类型转换:无论传递什么值,您都可以转换"它进入正确的类型。如果你的功能需要"一个数组,那么为什么要传递布尔值然后将它转换为数组?

此外,类型提示允许您指定特定类的对象实例。在下文中,$bar必须是类Bar的实例,否则会生成错误:

public function setBar(Bar $bar)

您不能将变量类型转换为特定类的对象。

答案 1 :(得分:2)

Type Hinting from PHP docs:

  

默认情况下,如果可能,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;
    }
}