【问题标题】:PHP BackedEnum interface fails the instanceof operatorPHP BackedEnum 接口使 instanceof 运算符失败
【发布时间】:2023-02-02 00:19:58
【问题描述】:

鉴于:

enum TestEnum: string
{
  case CASE_1 = "first case";
  case CASE_2 = "Second case";
}

这应该返回true

TestEnum::class instanceof \BackedEnum

但我得到false

我从这个 post 尝试了以下操作(它无法在 Laravel Tinker REPL 中运行,但作为脚本运行?):

interface TestEnumInterface extends \BackedEnum
{
    public function foo(): string;
}

enum TestEnum: string implements TestEnumInterface
{
    case CASE_1 = 'case 1';
    case CASE_2 = 'case 2';

    public function foo(): string
    {
        return 'bar';
    }
}



TestEnum::class instanceof \BackedEnum //false
TestEnum::class instanceof \TestEnumInterface //false

我错过了什么? 运行 PHP v8.1.13

谢谢


更新: 实际上,根据 SomeOne1 的回复,以下返回 true:

TestEnum::CASE_1 instanceof \BackedEnum

然后我会尝试更具体。 我必须测试一个变量 $list,它可以是许多不同的枚举(比如 $list = TestEnum::class$list = AnotherEnum::class),或者一个 Laravel 集合,或者一个数组。

  //if ($list instanceof \BackedEnum) {
  if (isset($isEnum)) { // I want to get rid of this
    // do stuff
  }
  else if ($list instanceof \Illuminate\Database\Eloquent\Collection || $list instanceof \Illuminate\Support\Collection) {
    // do stuff differently
  }
  else if (is_array($list)) {
    // do stuff differently
  }
  else {
    var_dump($list);
    dd('invalid list');
  }

那如何测试这个变量是不是枚举类型呢?

【问题讨论】:

    标签: php enums


    【解决方案1】:

    TestEnum::class 不是对象的实例,它是字符串的“实例”。 TestEnum::CASE_1 是 TestEnum 或 TestEnumInterface 的实例

    【讨论】:

    • 好的,谢谢你的回复。我更新了问题
    猜你喜欢
    • 2013-01-01
    • 2012-10-15
    • 1970-01-01
    • 2015-10-02
    • 2012-07-29
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多