使用枚举进行类型提示?

Tos*_*kan 6 php enums type-hinting

我在这里阅读了有关枚举及其“实现”的内容

PHP 和枚举

重点是,为什么要使用枚举,而不是用于类型提示?

但此实现不允许使用类型提示。因为枚举条目都是字符串。

我有什么办法可以说

function($a) {

}
Run Code Online (Sandbox Code Playgroud)

$a必须是'foo','bar''baz'

在 PHP 中?

我使用 phpstorm/intellij 所以如果有另一种方法可以做到这一点,那也很好。例如,在文档中说,但是使用 phpstorm 的自动完成魔法,或者可能是编译错误。

yiv*_*ivi 12

从 PHP 8.1 开始,您将能够使用实际的枚举

enum A {
    case FOO = 'foo';
    case BAR = 'bar';
    case BAZ = 'baz';
}
Run Code Online (Sandbox Code Playgroud)

然后在您的函数中a(),您将键入枚举的提示A

function a(A $a) {
    echo $a->value;
}
Run Code Online (Sandbox Code Playgroud)

现在a($a)只接受:

a(A::FOO);
a(A::BAR);
a(A::BAZ);
Run Code Online (Sandbox Code Playgroud)

甚至:

a(A::from('bar'));
Run Code Online (Sandbox Code Playgroud)

但任何无效的输入case都会失败并出现ValueError异常。


mlg*_*mlg 3

PHP 中没有内置方法来要求传递的字符串具有特定值;即使在 PHP7 中也没有。您可以输入我所知道的对象和数组的类型提示。枚举可以解决这个问题,但 PHP 不支持枚举。

如果您真的非常需要它,也许您应该考虑一种强类型编程语言。

如果您被 PHP 困住了

确保字符串遵循某些规则的一种简单方法是使其成为一个类,如果它不是这些值之一,则会爆炸。

尝试这个

<?php

class WeekDay {
    private $value;

    public function __construct($value) {
        if (!in_array($value, ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']))
            throw new Exception("Not a week day.");
        else
            $this->value = $value;
    }

    public function __toString() {
        return $this->value;
    }
}

function echoWeekDay(WeekDay $weekDay) {
    echo $weekDay . "\n";
}

echoWeekDay(new WeekDay("Tuesday"));
echoWeekDay(new WeekDay("Saturday"));
Run Code Online (Sandbox Code Playgroud)

运行与

~/Code/stack-overflow $ php enums.php
Tuesday
PHP Fatal error:  Uncaught exception 'Exception' with message 'Not a week day.' in /Users/marianol/Code/stack-overflow/enums.php:8
Stack trace:
#0 /Users/marianol/Code/stack-overflow/enums.php(23): WeekDay->__construct('Saturday')
#1 {main}
  thrown in /Users/marianol/Code/stack-overflow/enums.php on line 8

Fatal error: Uncaught exception 'Exception' with message 'Not a week day.' in /Users/marianol/Code/stack-overflow/enums.php:8
Stack trace:
#0 /Users/marianol/Code/stack-overflow/enums.php(23): WeekDay->__construct('Saturday')
#1 {main}
  thrown in /Users/marianol/Code/stack-overflow/enums.php on line 8
Run Code Online (Sandbox Code Playgroud)

顺便说一句,枚举主要并不用于函数参数的类型提示。例如,数据库使用枚举字段来优化存储效率(因为枚举需要比字符串少得多的存储空间),如果您的编程语言不提供枚举数据类型,则在检索、修改和持久化时必须非常小心将枚举数据类型返回到数据库。