类型提示与类型转换在 PHP 的 setter 函数中的区别

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

1
不,它们在功能上并不等价。如果您尝试传递意外的值,类型提示将会抛出错误,而类型转换将尝试更改该值的类型。 - mister martin
2个回答

12

它们并不具有功能上的等同性。

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

类型转换:无论传递什么值,都会将其“转换”为正确的类型。如果您的函数“需要”一个数组,那么为什么要让布尔值被传递然后将其转换为数组?

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

public function setBar(Bar $bar)

你无法将一个变量强制转换为特定类的对象。


谢谢...所以如果我只使用类型提示,那么它是否保证 $this->bar 将是一个数组(假设没有错误)? - mcmurphy
同时进行这两个操作有意义吗?或者有没有技术上的原因需要这样做? - mcmurphy
不。它保证如果不是,则会抛出错误。它不会强制转换或转换值。已编辑... - AbraCadaver

4

PHP文档中的类型提示:

默认情况下,PHP会将错误类型的值强制转换为预期的标量类型(如果可能)。例如,一个函数需要一个字符串参数,但给定了一个整数,则该函数将得到一个字符串类型的变量。

如果禁用 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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接