gpt4 book ai didi

php - PHP 中的动态常量?

转载 作者:可可西里 更新时间:2023-11-01 12:46:12 30 4
gpt4 key购买 nike

有没有办法动态创建类的常量?我知道这听起来有点奇怪,但让我解释一下我想做什么:

  • 我有一个 Enum 类,它的属性由静态 const 定义定义
  • 此类扩展了 PHP SplEnum 类
  • 我不想在代码中输入这些定义中的每一个,而是希望有一个静态初始化程序进入数据库并提取枚举值

也许是这样的:

class myEnum extends SplEnum {
public static function init () {
$myNameValuePair = DB_Functions::get_enum_list();
foreach ( $myNameValuePair as $name => $value) {
$const = array ( self , $name );
$const = $value;
}
}
}

我认识到这实际上不会起作用,因为它不设置 CONST,而是设置静态变量。也许我的整个想法都是胡思乱想,对此有更好的技术。无论如何,非常感谢任何实现最终目标的方法。

更新

我认为更清楚地了解我的目标可能会有所帮助,因为我认为我对常量的使用很可能不是很好。基本上我想要实现的是典型的枚举列表的要求:

  1. 约束函数签名。我希望能够请求“一组”值作为函数的输入。例如:

    公共(public)函数 do_something (ENUM_Types $type){}

  2. 简单紧凑。在代码中使用时允许使用简单紧凑的语法。例如,使用常量我可能会写一个条件语句,例如:

    if ( $my_var === ENUM_Types::TypeA ) {}

  3. 动态枚举。我希望通过前端管理此枚举并将其存储在数据库中(我为此使用 wordpress 管理屏幕以防万一有人关心)。在运行时,这个“列表”应该从数据库中提取出来,并作为枚举(或实现上述目标的类似结构)提供给代码。

最佳答案

将您的“枚举”值包装在一个单例中并实现(非静态)魔法 __get 方法:

<?php
class DynamicEnums {

private static $singleton;

private $enum_values;

public static function singleton() {
if (!self::$singleton) {
self::$singleton = new DynamicEnums();
}
return self::$singleton;
}

function __construct() {
$this->enum_values = array( //fetch from somewhere
'one' => 'two',
'buckle' => 'my shoe!',
);
}

function __get($name) {
return $this->enum_values[$name]; //or throw Exception?
}

public static function values() {
return self::singleton()->enum_values; //warning... mutable!
}
}

为了加分,创建一个返回单例的(非 OO)函数:

function DynamicEnums() {
return DynamicEnums::singleton();
}

“DynamicEnums”的消费者看起来像:

echo DynamicEnums::singleton()->one;
echo DynamicEnums()->one; //can you feel the magic?
print_r(DynamicEnums::values());

[编辑] 更像枚举。

关于php - PHP 中的动态常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113663/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com