2017-03-02 60 views
0

下面是代码有一个字符串,必须调用函数名称对应于字符串

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.'; 
    } 
} 

在这段代码中,凡在环路代表,我有一个字符串“用户名”是$ validationType。 然后,我需要调用循环下面的函数用户名。

我试图用call_user_func,但它给这个错误:

'call_user_func() expects parameter 1 to be a valid callback, function 'username' not found or invalid function name'

什么叫从字符串“用户名”的用户名()的正确方法?

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

+0

是在这个foreach()的相同范围内的username()函数?因为如果$ validationType真的是用户名,那么应该调用用户名。他们在一个班级或不同的文件? –

+0

确切地说,username()和foreach()都在同一个作用域内,它们都在类方法中。 –

+0

我认为函数用户名应该在另一个方法内,这就是为什么call_user_func()没有找到它。 bnest将重构,将用户名作为当前方法之外的另一种方法,并使用$ this - > $ validationType()来代替。 –

回答

0

根据您的意见,您的用户名函数()shoudn't是内部的另一种方法。这就是为什么call_user_func()没有找到它。

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

希望它能帮助。

2

我相信你的函数在类中,所以你想调用的任何函数都需要像$ this-> nameOfTheFunction()。

要调用你的函数,你可以这样做: $此 - > $ validationType()call_user_func($本 - > $ validationType())

+0

实际上所有这些代码都在一个方法中,所以我不能使用它。我可以重构代码当然,但不是在访问循环范围之外访问username()吗? –

0

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

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

这是未经测试,但可能工作。

0

您的功能必须是在同一个命名空间,则U可以测试调用


$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; 
} 
相关问题