【问题标题】:Type Hinting vs Type Casting in setters phpsetters php中的类型提示与类型转换
【发布时间】:2017-04-24 02:51:12
【问题描述】:

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

【问题讨论】:

  • 不,它们在功能上并不相同。如果您尝试传递意外的值,类型提示将引发错误,而类型转换将尝试更改值的类型。

标签: php casting setter type-hinting


【解决方案1】:

它们在功能上并不等同。

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

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

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

public function setBar(Bar $bar)

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

【讨论】:

  • 谢谢...所以如果我只使用类型提示,那么它是否保证 $this->bar 将是一个数组()(假设没有错误)?
  • 两者都做是否有意义/任何技术原因?
  • 没有。它保证如果不是则抛出错误。它不会转换或转换值。已编辑...
【解决方案2】:

Type Hinting from PHP docs:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2012-08-05
    相关资源
    最近更新 更多