PHP and Enumerations

后端 未结 30 1497
有刺的猬
有刺的猬 2020-11-22 13:39

I know that PHP doesn\'t have native Enumerations. But I have become accustomed to them from the Java world. I would love to use enums as a way to give predefined values whi

30条回答
  •  盖世英雄少女心
    2020-11-22 14:01

    The accepted answer is the way to go and is actually what I am doing for simplicity. Most advantages of enumeration are offered (readable, fast, etc.). One concept is missing, however: type safety. In most languages, enumerations are also used to restrict allowed values. Below is an example of how type safety can also be obtained by using private constructors, static instantiation methods and type checking:

    class DaysOfWeek{
     const Sunday = 0;
     const Monday = 1;
     // etc.
    
     private $intVal;
     private function __construct($intVal){
       $this->intVal = $intVal;
     }
    
     //static instantiation methods
     public static function MONDAY(){
       return new self(self::Monday);
     }
     //etc.
    }
    
    //function using type checking
    function printDayOfWeek(DaysOfWeek $d){ //compiler can now use type checking
      // to something with $d...
    }
    
    //calling the function is safe!
    printDayOfWeek(DaysOfWeek::MONDAY());
    

    We could even go further: using constants in the DaysOfWeek class might lead to misusage: e.g. one might mistakenly use it this way:

    printDayOfWeek(DaysOfWeek::Monday); //triggers a compiler error.
    

    which is wrong (calls integer constant). We can prevent this using private static variables instead of constants:

    class DaysOfWeeks{
    
      private static $monday = 1;
      //etc.
    
      private $intVal;
      //private constructor
      private function __construct($intVal){
        $this->intVal = $intVal;
      }
    
      //public instantiation methods
      public static function MONDAY(){
        return new self(self::$monday);
      }
      //etc.
    
    
      //convert an instance to its integer value
      public function intVal(){
        return $this->intVal;
      }
    
    }
    

    Of course, it is not possible to access integer constants (this was actually the purpose). The intVal method allows to convert a DaysOfWeek object to its integer representation.

    Note that we could even go further by implementing a caching mechanism in instantiation methods to save memory in the case enumerations are extensively used...

    Hope this will help

提交回复
热议问题