有一个字符串,必须调用与该字符串对应的名称的函数

时间:2017-03-02 13:31:50

标签: php

这是代码

 foreach ( $form as $fieldName => $fieldValue ) {
            $validationType = $validationCriterias[ $fieldName ] ?? null;

            if ( $validationType ) { // is  "username" at that point
                call_user_func( $validationType );
            }
        }

function username( )
{
    global $form;
    if ( ! v::alnum( '-_' )->noWhitespace()->length( 2, 30 )->validate( $form[ 'username' ] ) ) {
        $this->formErrorBag[ 'username' ] = 'User name must be between 2 and 30 characters please. No whitespace or special charactesr allowed, but "_" and "-" characters are allowed.';
    }
}

在这个代码中,在循环中指示的地方,我有一个字符串“username”是$ validationType。 然后,我需要调用循环下面的函数username。

我尝试使用call_user_func,但它出现了这个错误:

  

'call_user_func()期望参数1是有效的回调函数   未找到“用户名”或功能名称无效'

从字符串“username”调用username()的正确方法是什么?

编辑:此代码已经在类方法中,所以如果可能的话,我需要从循环内部访问username()范围。

4 个答案:

答案 0 :(得分:2)

我相信你的功能属于一个类,因此,你想要调用的任何函数都必须像$ this-> nameOfTheFunction()。

要调用您的功能,您可以执行以下操作: $ this-> $ validationType() call_user_func($ this-> $ validationType())

答案 1 :(得分:0)

如果你正在调用一个函数,我很确定你必须使用它背后的(),在你的代码中你只使用了这个名字。你可能会尝试类似的东西:

if ( $validationType. "()" ) { // is  "username" at that point
        call_user_func( $validationType. "()" );
    }

这是未经测试但可能有效。

答案 2 :(得分:0)

你的函数必须在同一名称空间中,然后你可以测试可调用的

$validators = ['username', 'surname', 'NotAFunction'];

foreach($validators as $func)
    if(is_callable($func))
        $func();


function username(){
     echo 'validation username' . PHP_EOL;
}

function surname(){
     echo 'validation surname' . PHP_EOL;
}

答案 3 :(得分:0)

根据您的评论,您的函数username()shoudn不在另一个方法中。这就是为什么call_user_func()没有找到它。

最好的方法是重构代码,将用户名作为另一种方法,这样您就可以将其称为$this->$validationType()

希望它有所帮助。