Как мне вызвать функцию, используя имя функции, сгенерированное из строковой переменной

#php

#php

Вопрос:

В процессе автоматизации некоторого кода я хочу вызвать функцию, основанную на том, что такое строка.

Например, у меня есть переменная $somevar , для которой установлена строка «This». Теперь я хочу запустить функцию doThis();

Итак, я надеялся, что смогу написать do.$somevar($var,$var2) . Я хочу, чтобы она выполнялась doThis($var1,$var2) .

Возможно ли это?

Комментарии:

1. диапазон возможностей для $somevar известен и ограничен или неизвестен и неограничен?

Ответ №1:

Для достижения этой цели вы можете использовать call_user_func.

 call_user_func("do" . $somevar, $var1, $var2);
  

Вы также можете использовать is_callable для проверки условий ошибки.

 if (is_callable("do" . $somevar)) {
    call_user_func("do" . $somevar, $var1, $var2);
} else {
    echo "Function do" . $somevar . " doesn't exist.";
}
  

Комментарии:

1. Насколько я знаю, call_user_func работает с любой вызываемой функцией, даже встроенной в функции php, такие как strtoupper, sprintf, …

2. @ChrisRamakers Вы правы, спасибо, что указали на это.

Ответ №2:

Я не думаю, что вы можете сделать это таким образом, но вы могли бы сделать:

 call_user_func('do'. $somevar, $var, $var2);
  

или

 $func = 'do' . $somevar;
$func($var, $var2);
  

Ответ №3:

Это совершенно законно в php

 $myVar = 'This';

$method = 'do'.$myVar; // = doThis
$class  = new MyClass();
$class->$method($var1, $var2, ...); // executes MyClass->doThis();
  

Ответ №4:

 $fname="do$somevar";
$fname();
  

Но вам следует дважды подумать, прежде чем использовать это.

Ответ №5:

проверьте call_user_func или call_user_func_array

 class myclass {
    static function say_hello()
    {
        echo "Hello!n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello'); // As of 5.2.3
  

Ответ №6:

В php вы используете -> вместо . это сработает:

 $foo = new someObject;
$somevar = 'function_name';
$foo->$somevar('x');
  

Комментарии:

1. Я думаю, что Роланд использовал . в качестве оператора конкатенации строк