在PHP中链接静态方法?

2022-08-30 09:27:20

是否可以使用静态类将静态方法链接在一起?假设我想做这样的事情:

$value = TestClass::toValue(5)::add(3)::subtract(2)::add(8)::result();

. . .显然,我希望$value被分配数字14。这可能吗?

更新:它不起作用(你不能返回“self” - 它不是一个实例!),但这是我的想法带我去的地方:

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;
    }
}

在解决了这个问题之后,我认为简单地使用类实例而不是尝试链接静态函数调用会更有意义(除非上面的示例可以以某种方式进行调整,否则看起来是不可能的)。


答案 1

我喜欢上面Camilo提供的解决方案,基本上,因为你所做的只是改变静态成员的值,并且由于你确实想要链接(即使它只是语法糖),那么实例化TestClass可能是最好的方法。

如果你想限制类的实例化,我会建议一个单例模式:

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();

答案 2
class oop{
    public static $val;

    public static function add($var){
        static::$val+=$var;
        return new static;
    }

    public static function sub($var){
        static::$val-=$var;
        return new static;
    }

    public static function out(){
        return static::$val;
    }

    public static function init($var){
        static::$val=$var;
        return new static;      
    }
}

echo oop::init(5)->add(2)->out();

推荐