web-dev-qa-db-ja.com

PHPの動的静的メソッド呼び出し?

誰かがPHPで助けてくれた。

$result = myClassName::myFunctionName();

ただし、このようなクラスを多数用意し、ユーザーの言語に応じてその場で正しいクラス名を決定したいと思います。言い換えれば、私は持っています:

$language = 'EN';

...そして、私は次のようなことをする必要があります:

$result = myClassName_EN::myFunctionName();

言語を関数のパラメーターとして渡し、1つの共通クラス内で処理できることは知っていますが、さまざまな理由から、別のソリューションを好むでしょう。

これは理にかなっていますか?ありがとう。

58
Tom

call_user_func 関数を使用します。

http://php.net/manual/en/function.call-user-func.php

例:

call_user_func('myClassName_' . $language . '::myFunctionName');
107
Ben Everard

私はと思うあなたができる:

$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();

これは 変数関数 と呼ばれます

20
Adam Hopkinson

ファクトリで必要なクラスの作成をカプセル化します。

この方法では、ベース名または言語を適切なクラスにマッピングするためのルールを変更する必要がある場合に、単一のエントリポイントがあります。

    class YourClassFactory {

        private $_language;
        private $_basename = 'yourclass';

        public YourClassFactory($language) {
            $this->_language = $language;
        }

        public function getYourClass() {
            return $this->_basename . '_' . $this->_language;
        }    
    } 

そして、それを使用する必要がある場合:

$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();
16
Silvio Donnini

Temuriが言ったように、 '$ className :: functionName'を試みると解析エラーが生成されます:

解析エラー:構文エラー、予期しないT_PAAMAYIM_NEKUDOTAYIM ...

私の場合(2つの引数を持つ静的メソッド)、最善の解決策は、 call_user_func_array を2つの配列で使用することです(nikc.orgによって提案されたとおり):

$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));

BR

6
Dimcho

あなたの対処方法は非常に悪い考えだと思いますが、解決策があるかもしれません

$className = 'myClassName_'.$language;
$result = $className::myFunctionName();

これがあなたが望むものだと思う

6
marvin

あなたの質問を理解できる限り、 get_class 関数を使用して実行できるクラス名を取得する必要があります。一方、 Reflection class は、OOP wayのメソッド、引数などに関しては素晴らしいことです。

1
Sarfraz

次は簡単にできます:

<?php

class B {

    public static $t = 5;

    public static function t($h) {
        return "Works!" . $h;
    }
}

$g = 't';
$class = 'B';

echo $class::$g('yes'); //Works! Yes

そして、PHP 5.2> =

1
KorbenDallas

次のようなソリューション:

_$yourClass::myFunctionName();
_

動作しないでしょう。 PHPは解析エラーを生成します。

残念ながら、唯一の方法は非常に遅いcall_user_func()を使用することです。

0
temuri