Chaining Static Methods in PHP?

前端 未结 16 2118
情歌与酒
情歌与酒 2020-11-27 14:25

Is it possible to chain static methods together using a static class? Say I wanted to do something like this:

$value = TestClass::toValue(5)::add(3)::subtrac         


        
16条回答
  •  悲&欢浪女
    2020-11-27 14:48

    You could always use the First method as a static and the remaining as instance methods:

    $value = Math::toValue(5)->add(3)->subtract(2)->add(8)->result();
    

    Or better yet:

     $value = Math::eval(Math::value(5)->add(3)->subtract(2)->add(8));
    
    class Math {
         public $operation;
         public $operationValue;
         public $args;
         public $allOperations = array();
    
         public function __construct($aOperation, $aValue, $theArgs)
         {
           $this->operation = $aOperation;
           $this->operationValue = $aValue;
           $this->args = $theArgs;
         }
    
         public static function eval($math) {
           if(strcasecmp(get_class($math), "Math") == 0){
                $newValue = $math->operationValue;
                foreach ($math->allOperations as $operationKey=>$currentOperation) {
                    switch($currentOperation->operation){
                        case "add":
                             $newvalue = $currentOperation->operationValue + $currentOperation->args;
                             break;
                        case "subtract":
                             $newvalue = $currentOperation->operationValue - $currentOperation->args;
                             break;
                    }
                }
                return $newValue;
           }
           return null;
         }
    
         public function add($number){
             $math = new Math("add", null, $number);
             $this->allOperations[count($this->allOperations)] &= $math;
             return $this;
         }
    
         public function subtract($number){
             $math = new Math("subtract", null, $number);
             $this->allOperations[count($this->allOperations)] &= $math;
             return $this;
         }
    
         public static function value($number){
             return new Math("value", $number, null);
         }
     }
    

    Just an FYI.. I wrote this off the top of my head (right here on the site). So, it may not run, but that is the idea. I could have also did a recursive method call to eval, but I thought this may be simpler. Please let me know if you would like me to elaborate or provide any other help.

提交回复
热议问题