【问题标题】:PHP7 - Can type hinting be trusted?PHP7 - 可以信任类型提示吗?
【发布时间】:2016-09-07 09:03:37
【问题描述】:

我最近开始研究 PHP 7 中引入的新类型提示,发现它是添加到我的一些应用程序中的一个非常好的和有用的补充,因此我已经这样做了,但是我有一个问题关于参数和返回类型提示。

假设我有一个基本函数,它对两个参数执行数学运算并返回一个整数。

function addTwo(int $a, int $b): int {
   return $a + $b;
}

预期的参数应该是整数,我们应该希望从函数中接收一个整数值,但是这是否始终得到保证,或者是否应该在函数内进行进一步的验证,例如 is_int 以确保两个参数都是整数?

【问题讨论】:

  • 何不试试看?
  • 我已经做了一些测试,但是我想知道它是否总是得到保证,或者是否存在一些可能不同并返回无效结果的用例
  • 如果您提供给函数的不是整数,它将返回一个可捕获的错误,因此您将有一个错误或返回一个 int。
  • 如果你把一个参数注解为一个int,你会得到一个int。在 PHP 7 中,这是严格执行的(而在 PHP 5 中,如果您真的需要,有一些方法可以绕过类型检查)。我想警告您,您的函数有点危险,因为在 PHP 中添加两个整数可能会返回一个浮点数(以防溢出),这将导致返回类型异常。这可能是也可能不是您想要的。
  • 这很有趣,会声明(strict_types=1);防止此问题并将类型限制为仅 int 以便无法返回浮点数,或者我必须在函数内执行进一步验证?

标签: php php-7 scalar


【解决方案1】:

这取决于条件。例如,在你的例子中转行不会成功,但是通过 float - 没问题,它会默默地转换为 int。

你必须写declare(strict_types=1);

strict_types=1 只能应用于在第一行直接声明它的文件,没有办法。

严格类型也会对​​返回类型声明产生影响。在里面 默认弱模式,返回值将被强制转换为正确的类型 如果他们还不是那种类型。在强模式下,返回 value 必须是正确的类型,否则 TypeError 将是 扔了。

Returning values

【讨论】:

  • 所以为了澄清一下,如果我在文件中将 strict_types 声明为 true,我的函数会在无效的参数调用时立即失败,这意味着它不会执行任何实际函数?我对此特别感兴趣的主要原因是因为我更希望函数在开始时失败并抛出类型错误,而不是在函数可能已经使用无效数据类型执行某些任务时执行到一半。跨度>
  • 处理参数时如果出现类型错误,函数体将不会被执行。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 2011-11-10
  • 2017-06-28
  • 2016-10-24
  • 2018-01-25
  • 2023-01-15
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多