Динамический вызов статического метода в PHP?

Мог кто-то испытал в PHP, выручают со следующим. Где-нибудь в моем коде, у меня есть вызов к общедоступному статическому методу в неинстанцированном классе:

$result = myClassName::myFunctionName();

Однако я хотел бы иметь много таких классов и определить корректное имя класса на лету согласно языку пользователя. Другими словами, я имею:

$language = 'EN';

... и я должен сделать что-то как:

$result = myClassName_EN::myFunctionName();

Я знаю, что мог передать язык в качестве параметра функции и соглашению с нею внутри всего один общий класс, но по различным причинам, я предпочту другое решение.

Это имеет какой-либо смысл, кого-либо? Спасибо.

59
задан Ben James 21 January 2010 в 11:56
поделиться

6 ответов

Используйте функцию Call_user_func :

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

Пример:

call_user_func('myClassName_' . $language . '::myFunctionName');
110
ответ дан 24 November 2019 в 18:06
поделиться

I Думаю Вы можете сделать:

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

Это называется функции переменной

21
ответ дан 24 November 2019 в 18:06
поделиться

, хотя я думаю, как вы, это очень плохое представление, я думаю, что у меня может быть решение

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

Я думаю, что это это то, что вы хотите

6
ответ дан 24 November 2019 в 18:06
поделиться

Насколько я мог понять ваш вопрос, вам нужно получить имя класса, которое можно сделать с помощью функции get_Class . С другой стороны, класс отражения может помочь вам здесь, что отлично, когда дело доходит до методов, аргументов и т. Д. О.

1
ответ дан 24 November 2019 в 18:06
поделиться

Я бы заключил бы создание класса, который вам нужен на заводе.

Таким образом, у вас будет единая точка входа, когда вам нужно изменить базовое имя или правила для отображения языка в правый класс.

    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
ответ дан 24 November 2019 в 18:06
поделиться

Такие решения, как:

$yourClass::myFunctionName();

не работают. PHP выдаст ошибку синтаксического анализа.

К сожалению, единственный способ - использовать очень медленный call_user_func () .

0
ответ дан 24 November 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: