是否可以在PHP中声明一个静态和非静态的方法?

2022-08-30 08:33:35

是否可以将对象中的方法声明为静态方法和非静态方法,该方法的名称与调用静态方法的名称相同?

我想创建一个具有静态方法“send”和调用静态函数的非静态方法的类。例如:

class test {
    private $text;
    public static function instance() {
        return new test();
    }

    public function setText($text) {
        $this->text = $text;
        return $this;
    }

    public function send() {
        self::send($this->text);
    }

    public static function send($text) {
        // send something
    }
}

我希望能够调用这两个上的函数是

test::send("Hello World!");

test::instance()->setText("Hello World")->send();

可能吗?


答案 1

你可以这样做,但这有点棘手。你必须通过重载来做到这一点:__call__callStatic神奇的方法。

class test {
    private $text;
    public static function instance() {
        return new test();
    }

    public function setText($text) {
        $this->text = $text;
        return $this;
    }

    public function sendObject() {
        self::send($this->text);
    }

    public static function sendText($text) {
        // send something
    }

    public function __call($name, $arguments) {
        if ($name === 'send') {
            call_user_func(array($this, 'sendObject'));
        }
    }

    public static function __callStatic($name, $arguments) {
        if ($name === 'send') {
            call_user_func(array('test', 'sendText'), $arguments[0]);
        }
    }
}

这不是一个理想的解决方案,因为它会让你的代码更难遵循,但它会起作用,只要你有PHP>= 5.3。


答案 2

我将创建一个隐藏类作为构造函数,并在父类中返回该隐藏类,该父类具有与隐藏类方法相等的静态方法:

// Parent class

class Hook {

    protected static $hooks = [];

    public function __construct() {
        return new __Hook();
    }

    public static function on($event, $fn) {
        self::$hooks[$event][] = $fn;
    }

}


// Hidden class

class __Hook {

    protected $hooks = [];

    public function on($event, $fn) {
        $this->hooks[$event][] = $fn;
    }

}

静态调用它:

Hook::on("click", function() {});

动态调用它:

$hook = new Hook;
$hook->on("click", function() {});

推荐