1. ホーム
  2. php

PHPでメソッドをstaticとnonstaticに宣言することは可能ですか?

2023-10-24 08:13:49

質問

オブジェクト内のメソッドを、静的メソッドを呼び出す同名の非静的メソッドとして宣言することは可能ですか?

静的メソッド "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
    }
}

この2つで関数を呼び出せるようにしたいのですが

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

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

は可能でしょうか?

どのように解決するのですか?

あなたは ができます。 を使うこともできますが、ちょっとやっかいです。オーバーロードでやらなければならない。 __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であれば動作します。