【问题标题】:PHP - Calling functions from an array?PHP - 从数组中调用函数?
【发布时间】:2013-08-22 15:54:32
【问题描述】:

这是我目前拥有的:

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。有没有更有效的方法来循环调用函数?

编辑:我不能使用call_user_func_array,因为我从它们的父类中调用非静态方法。还有其他方法吗?

【问题讨论】:

    标签: php arrays function loops foreach


    【解决方案1】:

    您正在寻找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 for PHP >= 5.0.0:

    Hello, World!Bob
    

    【讨论】:

    • 我不能使用 call_user_func_array 因为我从它们的父类中调用非静态方法。还有其他方法吗?
    • @Knuxchan - call_user_func_array() 不需要静态方法。请参阅我的示例代码和提供的演示。
    【解决方案2】:

    有一种东西叫做

    这应该可以帮助您防止参数计数的切换。

    剩下的就是一个简单的foreach循环

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

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2012-12-20
      • 2017-07-09
      • 2023-04-01
      相关资源
      最近更新 更多