我刚刚遇到了一个问题,我无法解释为什么这样做。
我有一个只接受字符串类型参数的函数。
示例类
class A {
public function __construct() {
$data = new \Illuminate\Support\Collection();
// getType($data) => object
$this->make($data);
}
private function make(string $str): string {
// getType($str) => string
...
}
}问题:为什么可以传递一个集合,即使只允许字符串?
发布于 2022-04-26 08:49:04
为了避免这种行为,您可以在PHP类的顶部添加:declare(strict_types=1);
发布于 2022-04-26 08:49:42
根据文档,php将尝试转换它:
默认情况下,如果可能,PHP会将错误类型的值强制放入预期的标量类型声明中。例如,为期望字符串的参数提供int的函数将得到一个类型为string的变量。
但是如果您用declare(strict_types=1);重新运行您的代码,您将得到TypeError消息。
发布于 2022-04-26 08:40:15
根据定义,空集合是空数组。然后,由于PHP的类型杂耍,它会传递您的方法。这意味着在比较不同类型的变量时,PHP将首先将它们转换为公共的可比类型,在这种情况下,这种类型将数组转换为字符串。
也可以通过类型转换变量来避免这种情况。
您可以找到有关PHP文档https://www.php.net/manual/en/language.types.type-juggling.php的更多信息。
https://stackoverflow.com/questions/72010710
复制相似问题