PHP中的bool与boolean类型提示:区别是什么?

82

我一直在尝试在PHP中更多地使用类型提示。今天我正在编写一个带有默认参数的布尔函数,我注意到这个函数的形式如下:

function foo(boolean $bar = false) {
    var_dump($bar);
}

实际上会抛出一个致命错误:

带有类类型提示的参数的默认值只能为NULL

尽管形式相似的函数

function foo(bool $bar = false) {
    var_dump($bar);
}

不会。但是,两者都

var_dump((bool) $bar);
var_dump((boolean) $bar);

给出完全相同的输出

:布尔值 false

为什么会这样?这类似于Java中的包装类吗?


3
请查看手册,以了解有效支持的类型 - hassan
3
在类型提示中使用“bool”。 - jchook
1个回答

108

http://php.net/manual/zh/functions.arguments.php#functions.arguments.type-declaration

警告
上述标量类型的别名不受支持。相反,它们被视为类或接口名称。例如,将 boolean 用作参数或返回类型将需要一个参数或返回值,它是类或接口 boolean 的实例,而不是类型 bool:

<?php
function test(boolean $param{}
test(true);
?>

以上示例将输出:

致命错误:传递给 test() 的第一个参数必须是 boolean 的实例,而给出的是 boolean 类型

简而言之,booleanbool 的别名,并且别名在类型提示中无效。
使用“真正”的名称:bool


类型提示类型转换之间没有相似之处。

类型提示是告诉函数应该接受哪种类型的东西。

类型转换是在不同的类型之间“切换”。

允许进行的强制转换有:

(int), (integer) - cast to integer
(bool), (boolean) - cast to boolean
(float), (double), (real) - cast to float
(string) - cast to string
(array) - cast to array
(object) - cast to object
(unset) - cast to NULL (PHP 5)
在 PHP 中,类型转换中的 (bool) 和 (boolean) 是相同的。

5
“Type Hinting” 和 “Type Casting” 之间没有相似性。但是,标量类型提示(包括参数和返回类型)确实执行了类型转换。换句话说:(function():bool { return 1; })() === true - okdewit
2
非常令人困惑,因为 gettype() 返回的是 "boolean" 而不是 "bool" - Jelle De Loecker
1
@skerit:我认为gettype()的返回值不能固定,因为出于历史原因和向后兼容性的考虑。PHP遗憾地充满了这种奇怪的边缘情况,因为他们想要避免任何现有的代码被破坏,但仍然要为未来编写的代码语法创建新规则。 - Mikko Rantalainen

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