繁体   English   中英

PHP-从数组调用函数?

[英]PHP - Calling functions from an array?

这是我目前拥有的:

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因为我从其父类中调用非静态方法。 还有另一种方法吗?

您正在寻找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;
    }
}

我们可以看到,PHP> = 5.0.0的输出如下:

Hello, World!Bob

有一件事叫做

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM