可以在枚举 php 8 上使用 class 名称
Is possible use class names on enum php 8
我正在阅读 php 枚举文档,据我了解,这个新功能的最基本形式是让我们设置要在 类 中用于类型检查的常量。
有什么方法可以使用 类 吗?示例:
enum ClassEnum {
case \App\Model\Test;
case \App\Model\AnotherTest;
}
不,你不能那样使用枚举。但是有几个选择。
首先也是最重要的是使用一个接口,它为实现必须公开哪些方法以及其他代码期望使用哪些方法与之交互设置契约。
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());
在极少数情况下,您想要使用多个 non-extending 类型,您也可以使用 PHP 8:
中引入的 Composite Types
class CompositeTest {
public function __construct(Foo|Bar $obj) {
$obj->doThing();
}
}
$c1 = new CompositeTest(new Foo());
$c2 = new CompositeTest(new Bar());
以上两个片段都将输出:
Foo: thing!
Bar: thing!
但我 绝对 推荐使用接口,因为它使您的代码更灵活,更易于编写和维护。
我正在阅读 php 枚举文档,据我了解,这个新功能的最基本形式是让我们设置要在 类 中用于类型检查的常量。
有什么方法可以使用 类 吗?示例:
enum ClassEnum {
case \App\Model\Test;
case \App\Model\AnotherTest;
}
不,你不能那样使用枚举。但是有几个选择。
首先也是最重要的是使用一个接口,它为实现必须公开哪些方法以及其他代码期望使用哪些方法与之交互设置契约。
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());
在极少数情况下,您想要使用多个 non-extending 类型,您也可以使用 PHP 8:
中引入的 Composite Typesclass CompositeTest {
public function __construct(Foo|Bar $obj) {
$obj->doThing();
}
}
$c1 = new CompositeTest(new Foo());
$c2 = new CompositeTest(new Bar());
以上两个片段都将输出:
Foo: thing!
Bar: thing!
但我 绝对 推荐使用接口,因为它使您的代码更灵活,更易于编写和维护。