【问题标题】:PHP function's string type declaration accepts integers [duplicate]PHP函数的字符串类型声明接受整数[重复]
【发布时间】:2021-06-29 14:06:44
【问题描述】:

我预计以下内容会生成类型错误,因为 123 是整数而不是字符串,所以可以为需要字符串的函数提供整数吗?

foo(123);

function foo(string $str) {
    ...
}

【问题讨论】:

  • 另请注意,严格类型声明不会使 PHP 严格类型化。 PHP 仍然是松散类型的。它只是类型检查的函数/方法参数和返回值。查看演示:sandbox.onlinephpfunctions.com/code/…
  • 非常感谢!

标签: php type-declaration


【解决方案1】:

是的,因为整数可以转换为字符串(例如数组不能)。 是的,除非你声明declare(strict_types=1)

foo(123);
function foo(string $str) {
    var_dump($str); // string(3) "123"
}

但是如下:

declare(strict_types=1);

function foo(string $str) { }
foo(123); // FAIL (Uncaught TypeError)

会抛出:

致命错误:未捕获的类型错误:foo():参数 #1 ($str) 必须是字符串类型,给定 int

【讨论】:

  • 第一个函数调用将打印string(3) "123"!
  • 对@Steverst1,是一个错字!已更正,谢谢!
【解决方案2】:

PHP manual 非常具体地说明了这种行为,并直接针对您提出的示例:

默认情况下,如果可能,PHP 会将错误类型的值强制转换为预期的标量类型声明。例如,为期望字符串的参数提供 int 的函数将获得字符串类型的变量。

这是否“OK”(如您所问)高度依赖于实现。

【讨论】:

  • 但是如果我们在严格模式下declare(strict_types=1); 会抛出一个错误!
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2021-08-23
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多