Подтвердить что ты не робот

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

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

$result = myClassName::myFunctionName();

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

$language = 'EN';

... и мне нужно сделать что-то вроде:

$result = myClassName_EN::myFunctionName();

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

Это имеет смысл, кто-нибудь? Спасибо.

4b9b3361

Ответ 2

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

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

    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();

Ответ 3

Я думаю, вы могли бы сделать:

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

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

Ответ 4

Как сказал temuri, возникает ошибка синтаксического анализа при попытке "$ className:: functionName":

Ошибка анализа: ошибка синтаксиса, неожиданный T_PAAMAYIM_NEKUDOTAYIM...

В моем случае (статический метод с двумя аргументами) наилучшим решением является использование call_user_func_array с двумя массивами (как было предложено nikc. орг):

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

BR

Ответ 5

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

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

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

Ответ 6

Насколько я понял ваш вопрос, вам нужно получить имя класса, которое можно выполнить с помощью get_class. С другой стороны, класс отражения может помочь вам здесь, что отлично, когда дело доходит до методов, аргументов и т.д. Способом OOP.

Ответ 7

Решения, такие как:

$yourClass::myFunctionName();

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

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

Ответ 8

Вы можете легко сделать следующее:

<?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 > =

Ответ 9

Я знаю, что это старый поток, но с PHP 5.3.0 вы должны использовать forward_static_call

$result = forward_static_call(array('myClassName_EN', 'myFunctionName'));

Используя переменную $language, она может выглядеть так:

$result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));