有人请向我解释为什么这不起作用,以及我做错了什么。出于某种原因,当我运行函数validateUsername
时,$error
变量保持完全不变,而不是评估为true
。这怎么可能?
然而,如果我删除函数中的代码并在没有函数调用的情况下直接运行它,它就可以工作。下面的例子非常简单,实际上是伪代码,但它不起作用。这种行为对PHP来说是独特的吗?我不想再用其他语言再碰到这个。
<?php
$username = 'danielcarvalho';
$error = false;
function validateUsername()
{
if (strlen($username) > 10)
{
$error = true;
}
}
validateUsername();
if ($error == false)
{
echo 'Success.';
}
else
{
echo 'Failure.';
}
?>
答案 0 :(得分:7)
这不起作用,因为$username
功能范围内的validateUsername
不可用。 (也不是$error
变量。)有关详细信息,请参阅PHP手册的variable scope部分。
你可以通过在你的函数中添加global $username, $error;
来解决这个问题,虽然这不是一个特别优雅的方法,因为全局变量因为太详细的原因而被避开。因此,最好接受$username
作为函数的参数,如下所示:
<?php
function validateUsername($username) {
if (strlen($username) > 10) {
return false;
}
return true;
}
if (validateUsername('danielcarvalho')) {
echo 'Success.';
}
else {
echo 'Failure.';
}
?>
答案 1 :(得分:1)
$ error在函数validateUsername中具有局部作用域。要访问全局变量,请使用global keyword。
了解范围here。将您的功能更改为:
function validateUsername($username)
{
global $error;
if (strlen($username) > 10)
{
$error = true;
}
}
validateUsername($用户名);
使用函数参数更好地实现:
function validateUsername($username, &$error)
{
if (strlen($username) > 10)
{
$error = true;
}
}
validateUsername($username, $error);
另一种实施方式:
function validateUsername($username)
{
if (strlen($username) > 10)
{
return true;
}
return false;
}
$error = validateUsername($username);