PHP Использование переменной при вызове статического метода - PullRequest
4 голосов
/ 26 октября 2009

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

$class = $_POST['class'];
$class::create();

Любой совет будет принят с благодарностью.

Спасибо.

Ответы [ 5 ]

8 голосов
/ 26 октября 2009

Если вы работаете с PHP 5.2, вы можете использовать call_user_func (или call_user_func_array):

$className = 'A';

call_user_func(array($className, 'method'));

class A {
    public static function method() {
        echo 'Hello, A';
    }
}

Получит вас:

Hello, A


Синтаксис, который вы использовали в своем вопросе, возможен только при PHP> = 5.3; см. справочную страницу Статическое ключевое слово , об этом:

Начиная с PHP 5.3.0, возможно ссылаться на класс с помощью переменной. Значение переменной не может быть ключевое слово (например, self, parent и статический).

2 голосов
/ 26 октября 2009

То, что у вас есть, работает с PHP 5.3 .

пс. Вы должны рассмотреть возможность очистки $ _POST ['class'], так как вы не можете быть уверены, что в нем будет.

1 голос
/ 26 октября 2009

использовать call_user_func

Вот пример с php.net

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

$myobject = new myclass();

call_user_func(array($myobject, 'say_hello'));
0 голосов
/ 26 октября 2009

Я полагаю, что это может быть сделано только с PHP 5.3.0. Проверьте эту страницу и найдите $classname::$my_static, чтобы увидеть пример.

0 голосов
/ 26 октября 2009

Возможно, я неправильно понимаю, что вы хотите, но как насчет этого?

switch ($_POST['ClassType']) {
    case "Class1":
        $class1::create();
        break;
    case "Class2":
        $class2::create();
        break;
    // etc.
}

Если это не сработает, вы должны посмотреть на EVAL (опасно, будьте осторожны.)

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