Как вызвать классы из переменной переменной? - PullRequest
0 голосов
/ 17 декабря 2009

Я не совсем уверен, как правильно поставить этот вопрос. Я хочу динамически вызывать функции, содержащиеся в классах (думаю, это означает, что они называются «методами»).

Вот пример моего кода, который, я надеюсь, поможет объяснить, чего я пытаюсь достичь.

В этом случае $ result возвращает все загруженные модули. Затем он проверяет, был ли PHP-файл модуля включен в его класс, а затем, если этот класс существует, - пытается вызвать класс напрямую.

foreach ($results as $result) {
    $moduleclass_name = 'TestClassName_' . $result->module_name . '::FunctionToCall';
    if (method_exists($moduleclass_name, 'FunctionToCall'))
        $VariableToRetrieve = $modulefunction_name($Parameter1, $Parameter2);
}

Это возвращает ошибку

"вызов неопределенной функции TestClassName_modulename :: FunctionToCall () "

хотя 'TestClassName' было объявлено правильно.

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2009

То, что вы хотите, вероятно, call_user_func_array().

Код будет выглядеть примерно так:

call_user_func_array(array($classNameOrInstance, $functionName), array($arg1, $arg2, $arg3));

EDIT Кроме того, в вашем примере вы, кажется, включили имя функции в параметр класса для method_exists тоже ...

0 голосов
/ 17 декабря 2009
  1. Я думаю, что это не работает, потому что ваш синтаксис может не поддерживать «статические вызовы методов». Я предлагаю вам попробовать метод Франца call_user_func().

  2. Я делал то же самое в предыдущем проекте.

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

class CDispatcher {
    public static function GetDispatcher( $module = 'core' ) {
        $class_name = $module . 'Dispatcher';

        try {
            // looks for the file associated with the class
            // if the file is not found an exception is raised
            search_class( $class_name );
        } catch ( exception $e ){
            throw new UnkwownModuleException($module);
        }

        return new $class_name();
    }
}

// Then, you call this class :
$new_instance = CDispatcher::GetDispatcher( $my_module );
0 голосов
/ 17 декабря 2009

Вы можете использовать call_user_func() как таковой для достижения того, что вы пытаетесь сделать. Кроме того, лучше использовать is_callable() вместо method_exists(), чтобы проверить, может ли метод вызываться (метод может существовать, но его видимость может помешать его вызову.

foreach ($results as $result) {
    $module_callback = array('TestClassName_' . $result->module_name,'FunctionToCall');
    if (is_callable($module_callback))
        $VariableToRetrieve = call_user_func($module_callback, $Parameter1, $Parameter2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...