【问题标题】:PHP function argument type declaration not enforced [duplicate]未强制执行 PHP 函数参数类型声明 [重复]
【发布时间】:2021-08-23 13:59:27
【问题描述】:

我在 PHP 8.0.7 中使用类型声明和一个简单的类,例如:

<?php
    class KV {
        public function __construct(private array $storage = []) {}

        public function put(string $key, string $value): bool {
            $this->storage[$key] = $value;
            echo "successfully put {$key} => {$value}" . PHP_EOL;
            return true;
        }

        public function getStorage(): array {
            return $this->storage;
        }
    }

    $kv = new KV();
    $kv->put('foo', 12);    // works
    $kv->put('bar', 123.2); // works
    $kv->put('car', true);  // works

    print_r($kv->getStorage());

但是,令我惊讶的是,当我尝试调用 $kv-&gt;put('foo', 12); 时,这并没有因参数类型无效而出错。它应该,因为12 不是字符串,对吧?我在这里想念什么? PHP 中有明确的类型声明,用于 int、float、bool、object、array 和混合等。

【问题讨论】:

标签: php php-8


【解决方案1】:

来自the PHP manual

严格输入

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

在脚本顶部添加 declare(strict_types=1); 以强制执行严格输入。

【讨论】:

    【解决方案2】:

    为了强制执行严格的类型检查,似乎我们必须在&lt;?php declare(strict_types=1);的开始php标签中使用特殊语法

    在我看来这很愚蠢,严格的类型检查应该是默认设置,尤其是在 PHP 8+ 中。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2012-02-16
      • 1970-01-01
      • 2018-01-19
      • 2020-05-12
      • 1970-01-01
      • 2020-08-23
      • 2020-10-11
      相关资源
      最近更新 更多