2011-12-16 2 views
5

можно присвоить переменной класса функцию во время выполнения, которая должна быть выполнена? своего рода «функции указатель», как Cможно назначить функцию переменной класса во время выполнения в php?

что-то вроде этого: (это не будет работать, так как сумма выходит за рамки А, но это шаблон я имею в виду)

class A { 
    public $function_name; 
    public functon run($arg1,$arg2){ 
     $function_name($arg1,$arg2); 
    } 
} 

function sum($a,$b){ 
    echo $a+$b; 
} 

$a=new A(); 
$a->function_name='sum'; 

$a->run();  

[редактировать ] я знаю, что есть «call_user_func», но это нужно, как я понимаю, чтобы иметь функцию в объеме или использовать метод общественного класса

+0

Возможный дубликат [Как добавить новый метод к объекту php на лету?] (Http://stackoverflow.com/questions/2938004/how-to-add-a-new-method-to-a -php-object-on-fly) – mario

ответ

3

Вы могли бы использовать anonymous function если вы используете PHP> 5.3.0:

$sum = function($a, $b) { 
    return $a+$b; 
} 

$a->function_name = $sum; 
2

Использование call_user_func_array:

<?php 
class A { 

    public $function_name; 

    public function run($arg1,$arg2){ 

     return call_user_func_array($this->function_name, array($arg1, $arg2)); 

    } 
} 

function sum($a,$b){ 
    return $a+$b; 
} 

$a=new A(); 
$a->function_name= 'sum'; 

var_dump($a->run(1,1)); //2 

?> 
+0

Прохладный! но мне нужно, чтобы объявление функции и инициализация класса находились в одной области? – Zorb

+0

@ Zorb, что вы имеете в виду, сумма является общедоступным методом класса A? Можете ли вы отредактировать исходный вопрос и поместить сумму там, где предполагается, что это должно быть – Esailija

+0

Вы как бы злоупотребляете 'call_user_func_array()' здесь ... если вы знаете параметры, вы должны просто использовать 'call_user_func()', если нет, вы должны do '$ args = func_get_args(); call_user_func_array ($ this-> function_name, $ args); 'вместо создания массива из известных параметров. – rdlowrey

1

Работает независимо от объема. Вам просто нужно позвонить, используя call_user_func. Я также исправил пару опечаток в вашем примере.

<?php 
    class A { 
     public $function_name; 
     public function run($arg1, $arg2) { 
     call_user_func($this->function_name, $arg1, $arg2); 
     } 
    } 

    function sum($a, $b){ 
     echo $a + $b; 
    } 

    $a = new A(); 
    $a->function_name = 'sum'; 

    $a->run(2, 3); 
?> 

Live example

0

Другой способ заключается в использовании переменных переменных (применительно к объекту метод)

public static function sum($arg1, $arg2) 
{ 
    .. 
} 

public function run($arg1, $arg2) 
{ 
    $func = $this->function_name; 
    $func($arg1, $arg2);   <-- procedural call 
    self::$func($arg1, $arg2); <-- static method call 
} 
0

Использовать любые изменения Callback p seudo type. Используйте его с call_user_func или call_user_func_array

В руководстве приводятся отличные примеры использования вышеуказанного.

Также см. Новый метод php 5.4 Closure::bindTO, если вы хотите иметь возможность легко использовать $ this ключевое слово в нем.

Смежные вопросы