可以在枚举 php 8 上使用类名

发布于 2025-01-10 19:24:42 字数 188 浏览 1 评论 0原文

我正在阅读 php 枚举文档,据我了解,这个新功能最基本的形式是让我们设置在类中使用的常量以进行类型检查。

有什么办法可以与课程一起工作吗?例子:

enum ClassEnum {
   case \App\Model\Test;
   case \App\Model\AnotherTest;
}

I'm reading the php enum documents and from what I understand, this new feature in its most basic form is for us to set constants to be used in classes for type checking.

Is there any way to work with classes? Example:

enum ClassEnum {
   case \App\Model\Test;
   case \App\Model\AnotherTest;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

临风闻羌笛 2025-01-17 19:24:42

不,你不能那样使用枚举。但还有几种选择。

首先也是最重要的是使用接口,它为实现必须公开哪些方法以及其他代码可以期望使用哪些方法与其交互设置契约。

interface FooInterface {
    public function doThing();
}

class Foo implements FooInterface {
    public function doThing() {
        printf("%s: thing!\n", __CLASS__);
    }
}

class Bar implements FooInterface {
    public function doThing() {
        printf("%s: thing!\n", __CLASS__);
    }
}

class InterfaceTest {
    public function __construct(FooInterface $obj) {
        $obj->doThing();
    }
}

$t1 = new InterfaceTest(new Foo());
$t2 = new InterfaceTest(new Bar());

在极少数情况下,您想要使用多个非扩展类型,您也可以使用 复合类型 是在 PHP 8 中引入的:

class CompositeTest {
    public function __construct(Foo|Bar $obj) {
        $obj->doThing();
    }
}

$c1 = new CompositeTest(new Foo());
$c2 = new CompositeTest(new Bar());

上面的两个片段都会输出:

Foo: thing!
Bar: thing!

但是我远远建议使用接口,因为它使得你的代码更加灵活,更容易编写和维护。

No, you can't use Enums like that. But there are a couple alternatives.

First and foremost would be to use an interface, which sets the contract for what methods an implementation must expose, and what methods other code can expect to use to interact with it.

interface FooInterface {
    public function doThing();
}

class Foo implements FooInterface {
    public function doThing() {
        printf("%s: thing!\n", __CLASS__);
    }
}

class Bar implements FooInterface {
    public function doThing() {
        printf("%s: thing!\n", __CLASS__);
    }
}

class InterfaceTest {
    public function __construct(FooInterface $obj) {
        $obj->doThing();
    }
}

$t1 = new InterfaceTest(new Foo());
$t2 = new InterfaceTest(new Bar());

In the rare case that you want to use multiple, non-extending types you can also use Composite Types which were introduced in PHP 8:

class CompositeTest {
    public function __construct(Foo|Bar $obj) {
        $obj->doThing();
    }
}

$c1 = new CompositeTest(new Foo());
$c2 = new CompositeTest(new Bar());

Both of the above snippets will output:

Foo: thing!
Bar: thing!

But I far and away recommend using Interfaces as it makes your code more flexible and easier to write and maintain.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文