Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Chaining Static Methods in PHP?

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)::subtract(2)::add(8)::result(); 

. . . and obviously I would want $value to be assigned the number 14. Is this possible?

Update: It doesn't work (you can't return "self" - it's not an instance!), but this is where my thoughts have taken me:

class TestClass {     public static $currentValue;      public static function toValue($value) {         self::$currentValue = $value;     }      public static function add($value) {         self::$currentValue = self::$currentValue + $value;         return self;     }      public static function subtract($value) {         self::$currentValue = self::$currentValue - $value;         return self;     }      public static function result() {         return self::$value;     } } 

After working that out, I think it would just make more sense to simply work with a class instance rather than trying to chain static function calls (which doesn't look possible, unless the above example could be tweaked somehow).

like image 524
Wilco Avatar asked Sep 24 '08 03:09

Wilco


People also ask

What is method chaining in PHP?

Method chaining is a fluent interface design pattern used to simplyify your code. If you've used frameworks like Zend or jQuery, you probably have some experience with chaining. Essentially your objects return themselves, allowing you to "chain" multiple actions together.

Can we have multiple static methods?

The answer is 'Yes'. We can have two or more static methods with the same name, but differences in input parameters.

Can static methods be inherited in PHP?

The static variable is used in the A and B classes, yet the method is inherited so it is actually the same code which is called. Until PHP 8.0, there would be a distinct static variable depending on which class is called.

Can we call static method multiple times?

@SangitGurung it's not. The methods are executed in separate activation frames.


1 Answers

I like the solution provided by Camilo above, essentially since all you're doing is altering the value of a static member, and since you do want chaining (even though it's only syntatic sugar), then instantiating TestClass is probably the best way to go.

I'd suggest a Singleton pattern if you want to restrict instantiation of the class:

class TestClass {        public static $currentValue;      private static $_instance = null;      private function __construct () { }      public static function getInstance ()     {         if (self::$_instance === null) {             self::$_instance = new self;         }          return self::$_instance;     }      public function toValue($value) {         self::$currentValue = $value;         return $this;     }      public function add($value) {         self::$currentValue = self::$currentValue + $value;         return $this;     }      public function subtract($value) {         self::$currentValue = self::$currentValue - $value;         return $this;     }      public function result() {         return self::$currentValue;     } }  // Example Usage: $result = TestClass::getInstance ()     ->toValue(5)     ->add(3)     ->subtract(2)     ->add(8)     ->result(); 
like image 150
Mathew Byrne Avatar answered Sep 25 '22 21:09

Mathew Byrne