Вызов изменяющегося имени функции для объекта с помощью PHP: как? - PullRequest
2 голосов
/ 19 июня 2009

Как бы я сделал что-то вроде этого:

class Test
{

    public function test($methodName) {
        $this->$methodName;
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

Может быть, я должен просто передать параметр "ТИП" и использовать "оператор IF", но мне просто любопытно! :)

А что если «имя динамической функции» имеет один или несколько параметров?

ОБНОВЛЕНИЕ: Спасибо всем! :)

ОБНОВЛЕНИЕ № 2 - Ответ:

class Test
{

    public function testOut($methodName) {
        $this->$methodName();
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->testOut("a");
$testObj->testOut("b");

Проблема с классом заключается в том, что был метод с именем «Test» (такой же, как имя класса) ... Я изменил его, и он работал.

Ответы [ 5 ]

4 голосов
/ 19 июня 2009
class Test
{

    public function test($methodName) {
        $this->$methodName();
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->test("a");
$testObj->test("b");
1 голос
/ 19 июня 2009

Если у вас есть «имя динамической функции» с более чем одним параметром, вы можете использовать call_user_func_array, например так:

//in class context..
//$parameters can be an array like array(1,2)
call_user_func_array(array($this, $methodName), $parameters);

Причина, по которой вы хотите использовать call_user_func_array вместо call_user_func, заключается в том, что вы можете передавать параметры, которые функция принимает в виде массива, а не просто как дополнительные параметры, что позволяет вам легко иметь переменное количество аргументов.

1 голос
/ 19 июня 2009

call_user_func позволяет вам делать подобные вещи.

Например,

funcname = 'a';
call_user_func(array($testObj, $funcname));

Другой альтернативой является использование переменных методов

Например,

$funcname = 'a';
$testObj->$funcname();
1 голос
/ 19 июня 2009

Проверьте call_user_func() - он должен делать то, что вы хотите.

Документация здесь

0 голосов
/ 19 июня 2009

Следуя вашему конкретному примеру и сценарию использования, единственный способ добиться этого точно:

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

будет использовать eval () :

class Test
{

    public function test($methodName) {
        eval($methodName);
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

Другие указали решение, используя call_user_func(), и это правильно. Также очевидно, что это быстрее, чем использование eval () для вызовов функций. Читать это:

http://nz.php.net/manual/en/function.call-user-func.php#64415

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