有一个字符串,必须调用函数名称对应于字符串
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'
什么叫从字符串“用户名”的用户名()的正确方法?
编辑:这段代码已经在类方法中,所以如果可能的话,我需要从循环内访问用户名()范围。
根据您的意见,您的用户名函数()shoudn't是内部的另一种方法。这就是为什么call_user_func()没有找到它。
最好的办法是重构代码,将用户名作为另一种方法,这样你就可以称其为$this->$validationType()
希望它能帮助。
我相信你的函数在类中,所以你想调用的任何函数都需要像$ this-> nameOfTheFunction()。
要调用你的函数,你可以这样做: $此 - > $ validationType()或call_user_func($本 - > $ validationType())
实际上所有这些代码都在一个方法中,所以我不能使用它。我可以重构代码当然,但不是在访问循环范围之外访问username()吗? –
如果你调用一个函数我很确定你必须使用它后面的()
,在你的代码中你只使用了这个名字。你可能会尝试这样的:
if ($validationType. "()") { // is "username" at that point
call_user_func($validationType. "()");
}
这是未经测试,但可能工作。
您的功能必须是在同一个命名空间,则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;
}
是在这个foreach()的相同范围内的username()函数?因为如果$ validationType真的是用户名,那么应该调用用户名。他们在一个班级或不同的文件? –
确切地说,username()和foreach()都在同一个作用域内,它们都在类方法中。 –
我认为函数用户名应该在另一个方法内,这就是为什么call_user_func()没有找到它。 bnest将重构,将用户名作为当前方法之外的另一种方法,并使用$ this - > $ validationType()来代替。 –