PHP - 是否可以声明静态和非静态方法

alp*_*nyx 65 php oop

我可以将对象中的方法声明为静态和非静态方法,并且具有调用静态方法的相同名称吗?

我想创建一个具有静态方法"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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

test::send("Hello World!");
Run Code Online (Sandbox Code Playgroud)

test::instance()->setText("Hello World")->send();
Run Code Online (Sandbox Code Playgroud)

可能吗?

lon*_*day 75

可以做到这一点,但这有点棘手.你有超载做到这一点:__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 function __callStatic($name, $arguments) {
        if ($name === 'send') {
            call_user_func(array('test', 'sendText'), $arguments[0]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个理想的解决方案,因为它使您的代码更难以遵循,但只要您有PHP> = 5.3,它就可以工作.

  • 这让我的眼睛变得̢̢̗̫͕̗̫͕͓̫͈҉͍̖͙ḙ̣̭̦̫̞͟.我不会贬低它,因为你已经警告他,这种编码不会缓解他的生活,这是有帮助的.但仍然:< (31认同)
  • @lonesomeday投票只是因为你有耐心写出几乎没有实际用途的代码!然后回答问题:-) (10认同)
  • @Truth是的.它应该是"你可以做到这一点,但你真的***不应该." (4认同)
  • 你们都说这是一个坏主意,但是如果您有一个函数希望能够用作成员以便访问成员变量和另一个与相同的目的,但您可以在其中使用自己的论点?当然,你可以只使用函数的实例来获取变量,但想象它们是私有的。它应该对例如数学很有用,它在不需要类实例的情况下很有用,而当需要时。没有混乱和更快的编码。否则可以使用注释。:D (2认同)