带有enumartions的PHP类型提示?

时间:2016-05-07 01:07:36

标签: php enums type-hinting

我在这里读到有关动词及其“实施”的信息

PHP and Enumerations

重点是,为什么使用枚举,何时不进行类型提示?

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

有没有办法可以说

function($a){

}

$a必须为'foo''bar''baz'

在PHP中

我使用phpstorm / intellij所以如果有另一种方法可以做到这一点,我也会没事的。例如。在文档中说但是使用phpstorm中的autocompletion magic可能会编译错误

2 个答案:

答案 0 :(得分: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"));

使用

运行
~/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

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

答案 1 :(得分:2)

从 PHP 8.1 开始,您将能够to use actual enumerations

enum A {
    case FOO = 'foo';
    case BAR = 'bar';
    case BAZ = 'baz';
}

然后在您的函数 a() 中,您需要为枚举 A 键入提示。

function a(A $a) {
    echo $a->value;
}

现在 a($a) 只接受:

a(A::FOO);
a(A::BAR);
a(A::BAZ);

甚至:

a(A::from('bar'));

但任何不是有效 case 的输入都会因 ValueError 异常而失败。