2013-08-14 6 views
0

У меня есть следующий пример кодаКак вызвать функцию переменной в php внутри класса?

<?php 

class Test { 
    function foo() { 
     print "foo\n"; 
    } 

    function bar() { 
     $func = 'foo'; 
     $func(); 
    } 
} 

$test = new Test(); 
$test->bar() 

, который вызывает $test-bar(), whiich внутренне вызывает переменную функцию PHP с именем foo. Эта переменная содержит строку foo, и я хочу, чтобы функция foo называлась like here. Вместо того, чтобы ожидаемый выход

foo 

Я получаю сообщение об ошибке:

PHP Fatal error: Call to undefined function foo() ... 

Как сделать это правильно, при использовании строки для имени-функции? Строка «func» может обозначать несколько различных функций внутри области класса в фактическом коде.

Согласно the doc выше должен работать, как я закодирован, более или менее ...

+0

0_0 Как насчет использования структур данных, а не таких ужасов, как '$ func = 'foo'; $ FUNC(); '? –

ответ

5
<?php 

class Test { 
    public function foo() { 
     print "foo\n"; 
    } 

    public function bar() { 
     $func = 'foo'; 
     $this->$func(); 
    } 
} 

$test = new Test(); 
$test->bar(); 

?> 

Используйте это для доступа к текущей функции этого класса

+1

http://codepad.org/j4x0c4Du - works –

+0

Спасибо, это то, что я искал. Может быть, кто-то может добавить это в php docs ...? – Alex

+0

да дорогая. его логический. –

0

Вы использовать ключевое слово $this

<?php 

class Test { 
    function foo() { 
     print "foo\n"; 
    } 

    function bar() { 
     $this->foo(); // you can do this 

    } 
} 

$test = new Test(); 
$test->bar() 

Есть два способа вызова метода из строки ввода :

$methodName = "foo"; 
$this->$methodName(); 

Или вы можете использовать call_user_func_array()

call_user_func_array("foo",$args); // args is an array of your arguments 

или

call_user_func_array(array($this,"foo"),$args); // will call the method in this scope 
+0

Я не хочу напрямую обращаться к функции, мне нужна строка с именем функции. Я обновил вопрос, чтобы сделать это ясно. Сожалею. – Alex

+0

Я вижу, есть два способа сделать это, см. Мое обновление – Ibu

0

Что вы можете сделать, это использовать функцию call_user_func() для вызова функции обратного вызова.

<?php 

class Test { 
    public function foo() { 
     print "foo\n"; 
    } 

    public function bar() { 
     $func = 'foo'; 
     call_user_func(array($this, $func)); 
    } 
} 

$test = new Test(); 
$test->bar();