代码之家  ›  专栏  ›  技术社区  ›  Blackbam

PHP中的最后一个抽象类?

  •  1
  • Blackbam  · 技术社区  · 7 年前

    abstract final class NoticeTypes {
        const ERROR = "error";
        const WARNING = "warning";
        const INFO = "info";
        const SUCCESS = "success";
    
        static function getAll() {
            $oClass = new ReflectionClass(__CLASS__);
            return $oClass->getConstants();
        }
    }
    

    致命错误:无法对中的抽象类使用final修饰符。。。

    不过,我想用它作为一种 常量从不可修改枚举 ". 它应该:

    • 不允许实例化

    1 回复  |  直到 7 年前
        1
  •  12
  •   Akira Yamamoto    7 年前

    您可以将其设置为final并为其提供一个私有构造函数:

    final class NoticeTypes {
      const ERROR = "error";
      const WARNING = "warning";
      const INFO = "info";
      const SUCCESS = "success";
    
      static function getAll() {
        $oClass = new ReflectionClass(__CLASS__);
        return $oClass->getConstants();
      }
    
      private function __construct() {}
    }
    

    这里,“final”负责“cannotbeextended”需求,而私有构造函数负责“cannotbeinstantiated”。

    至于“为什么”你做不到,只是因为这是语言规范;另外,正如@CD001在他的评论中指出的:

    抽象类的全部要点是它们要被扩展,所以抽象的final在某种程度上是矛盾的

    RFC 但似乎没有成功。