2013-08-20 2 views
2

Это то, что я в настоящее время:PHP - Вызов функций из массива?

public function setUp() { 
    $tests = array(
       'printHello' => array(),  
       'printWorld' => array(), 
       'printName' => array('Bob'), 
      ); 
} 


public function printHello() { 
echo "Hello, "; 
} 

public function printWorld() { 
echo "World!"; 
} 

public function printName($name=false) { 
echo $name; 
} 

То, что я хочу сделать, это перебрать все функции и выполнять их последовательно. Это то, что я должен был в конечном итоге делает, но это только кажется, что там должно быть более эффективный способ сделать это:

foreach($tests as $test=>$parameters) { 
    $num_params = count($parameters); 
    switch($num_params) { 
     case 0: 
      $this->$test(); 
      break; 
     case 1: 
      $this->$test($parameters[0]); 
      break; 
     case 2: 
      $this->$test($parameters[0],$parameters[1]); 
      break; 
     case 3: 
      $this->$test($parameters[0],$parameters[1],$parameters[2]); 
      break; 
     default: 
      echo "Error! More than 3 parameters for function" . $test . "!"; 
      exit; 
    }  
} 

Я использую PHP 5.3. Есть ли более эффективный способ вызова функций в цикле?

EDIT: I не может использовать call_user_func_array, потому что я вызываю нестатические методы из своего родительского класса. Есть ли другой способ?

ответ

2

Вы ищете call_user_func_array():

foreach($tests as $test=>$parameters) { 
    call_user_func_array(array($this, $test), $parameters); 
} 

Загрузка это в простой тестовый класс:

class Test { 
    public function setUp() { 
     $tests = array(
      'printHello' => array(),  
      'printWorld' => array(), 
      'printName' => array('Bob'), 
     ); 
     foreach($tests as $fn => $params) 
      call_user_func_array(array($this, $fn), $params); 
    } 

    public function printHello() { 
     echo "Hello, "; 
    } 

    public function printWorld() { 
     echo "World!"; 
    } 

    public function printName($name=false) { 
     echo $name; 
    } 
} 

Мы можем видеть, что this outputs для PHP> = 5.0.0:

Hello, World!Bob 
+0

Я не могу использовать call_user_func_array, потому что я звоню не-статические методы из в пределах своего родительского класса. Есть ли другой способ? – Knuxchan

+2

@Knuxchan - для статических методов не требуется использование 'call_user_func_array()'. Посмотрите мой пример кода и демонстрацию. – nickb

+1

Спасибо! Оно работает! Ценить это! – Knuxchan

2

Одна вещь есть

это должно помочь вам предотвратить переключатель для подсчета параметров уже.

Остальное простой Еогеасп-петля

foreach ($tests as $method => $parameters) 
{ 
    $callback = array($this, $method); 
    call_user_func_array($callback, $parameters); 
} 
Смежные вопросы