为了账号安全,请及时绑定邮箱和手机立即绑定

PHP与数字

/ 猿问

PHP与数字

德玛西亚99 2019-07-11 12:52:07

PHP与数字

我知道PHP没有本地数字。但是我已经习惯了他们来自Java世界。我想使用枚举作为一种方式提供预先定义的值,IDES的自动完成功能可以理解。

常量可以起作用,但是存在名称空间冲突问题,而且(或者实际上)因为)它们是全球性的。数组没有名称空间问题,但是它们太模糊了,它们可以在运行时被覆盖,IDE很少(永远不会?)知道如何自动填充他们的钥匙。

有没有你常用的解决方案/解决办法?有人还记得PHP的人是否对枚举有过任何想法或决定吗?


查看完整描述

3 回答

?
拉丁的传说

根据用例的不同,我通常会使用一些东西。简约如下所示:

abstract class DaysOfWeek{
    const Sunday = 0;
    const Monday = 1;
    // etc.}$today = DaysOfWeek::Sunday;

但是,其他用例可能需要对常量和值进行更多的验证。基于下面关于反射的评论,以及其他几个音符,下面是一个扩展的示例,它可以更好地服务于范围更广的案例:

abstract class BasicEnum {
    private static $constCacheArray = NULL;

    private static function getConstants() {
        if (self::$constCacheArray == NULL) {
            self::$constCacheArray = [];
        }
        $calledClass = get_called_class();
        if (!array_key_exists($calledClass, self::$constCacheArray)) {
            $reflect = new ReflectionClass($calledClass);
            self::$constCacheArray[$calledClass] = $reflect->getConstants();
        }
        return self::$constCacheArray[$calledClass];
    }

    public static function isValidName($name, $strict = false) {
        $constants = self::getConstants();

        if ($strict) {
            return array_key_exists($name, $constants);
        }

        $keys = array_map('strtolower', array_keys($constants));
        return in_array(strtolower($name), $keys);
    }

    public static function isValidValue($value, $strict = true) {
        $values = array_values(self::getConstants());
        return in_array($value, $values, $strict);
    }}

通过创建扩展BasicEnum的简单枚举类,您现在可以使用方法来进行简单的输入验证:

abstract class DaysOfWeek extends BasicEnum {
    const Sunday = 0;
    const Monday = 1;
    const Tuesday = 2;
    const Wednesday = 3;
    const Thursday = 4;
    const Friday = 5;
    const Saturday = 6;}DaysOfWeek::isValidName('Humpday');                  
    // falseDaysOfWeek::isValidName('Monday');                   
    // trueDaysOfWeek::isValidName('monday');                  
     // trueDaysOfWeek::isValidName('monday', $strict = true);   
     // falseDaysOfWeek::isValidName(0);                          
     // falseDaysOfWeek::isValidValue(0);                        
      // trueDaysOfWeek::isValidValue(5);                         
      // trueDaysOfWeek::isValidValue(7);                         
      // falseDaysOfWeek::isValidValue('Friday');                  
      // false

作为附带说明,任何时候我至少使用反射一次。在静态/Const类中,数据不会更改(例如在枚举中),我缓存这些反射调用的结果,因为每次使用新的反射对象最终都会对性能产生明显的影响(存储在多个枚举的关联数组中)。

现在大多数人最后升级至少5.3,以及SplEnum是可用的,这当然也是一个可行的选择-只要你不介意传统上不直观的概念,即拥有实际的枚举。实例化通过你的代码库。在上面的例子中,BasicEnumDaysOfWeek根本不能实例化,也不应该实例化。


查看完整回答
反对 回复 2019-07-11
?
慕运维1137616

还有一个本机扩展。这个斯普兰

SplEnum提供了在PHP中本地模拟和创建枚举对象的能力。

http:/www.php.net/手册/en/class.plum.php


查看完整回答
反对 回复 2019-07-11
?
至尊宝的传说

那类常量呢?

<?phpclass YourClass{
    const SOME_CONSTANT = 1;

    public function echoConstant()
    {
        echo self::SOME_CONSTANT;
    }}echo YourClass::SOME_CONSTANT;$c = new YourClass;$c->echoConstant();


查看完整回答
反对 回复 2019-07-11

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信