带有枚举的类型提示?

问题描述 投票:2回答:1

我已经在这里阅读了有关枚举及其实现的信息

PHP and Enumerations

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

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

我有话可以说

function($a){

}

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

在php中?

我使用phpstorm / intellij,因此,如果还有另一种方法,我也很好。例如。在文档中说,但是具有来自phpstorm的自动补全魔法,可能会编译错误

php enums type-hinting
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.