简单PHP函数布尔问题

简单PHP函数布尔问题,php,function,boolean,Php,Function,Boolean,有人请向我解释为什么这不起作用,以及我做错了什么。出于某种原因,当我运行函数validateUsername时,$error变量保持完全不变,而不是计算为true。这怎么可能 然而,如果我删除了函数中的代码,直接运行它而不调用函数,它就可以工作了。下面的示例非常简单,实际上是伪代码,但它不起作用。这种行为是PHP独有的吗?我不想在其他语言中再次遇到这个问题 <?php $username = 'danielcarvalho'; $error = false; function vali

有人请向我解释为什么这不起作用,以及我做错了什么。出于某种原因,当我运行函数
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.';
}

?>

$error在函数validateUsername中具有本地作用域。要访问全局变量,请使用全局关键字

阅读有关范围的内容。将您的功能更改为:

function validateUsername($username)
{
    global $error;
    if (strlen($username) > 10)
    {
        $error = true;
    }
}
validateUsername($username)

使用函数参数更好地实现:

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);

$error在函数validateUsername中具有本地作用域。要访问全局变量,请使用全局关键字

阅读有关范围的内容。将您的功能更改为:

function validateUsername($username)
{
    global $error;
    if (strlen($username) > 10)
    {
        $error = true;
    }
}
validateUsername($username)

使用函数参数更好地实现:

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);

这不起作用,因为
$username
validateUsername
函数的范围内不可用。(也不是
$error
变量。)有关更多信息,请参阅PHP手册的一节

您可以通过添加
global$username$error在函数中,尽管这不是一种特别优雅的方法,因为全局变量由于过于详细的原因而被回避。因此,最好接受
$username
作为函数的参数,如下所示:

<?php
    function validateUsername($username) {
        if (strlen($username) > 10) {
            return false;
        }

        return true;
    }

    if (validateUsername('danielcarvalho')) {
        echo 'Success.';
    }
    else {
        echo 'Failure.';
    } 
?>

这不起作用,因为
$username
在您的
validateUsername
功能范围内不可用。(也不是
$error
变量。)有关更多信息,请参阅PHP手册的一节

您可以通过添加
global$username$error在函数中,尽管这不是一种特别优雅的方法,因为全局变量由于过于详细的原因而被回避。因此,最好接受
$username
作为函数的参数,如下所示:

<?php
    function validateUsername($username) {
        if (strlen($username) > 10) {
            return false;
        }

        return true;
    }

    if (validateUsername('danielcarvalho')) {
        echo 'Success.';
    }
    else {
        echo 'Failure.';
    } 
?>



Read up on variable scope(读取变量范围):除了变量范围外,还读取函数返回值。它只是在同一页的函数中,这肯定不是变量范围问题吗?我猜我错了。我会读的。读变量范围:除了变量范围外,还读函数返回值。它就在同一页的函数中,这肯定不是变量范围的问题吗?我猜我错了。全局变量并不是世界上所有问题的答案:它们可能会导致比它们解决的问题更多的问题,而且当函数参数和返回值更正确时,不推荐使用全局变量approach@Ashwini你的两个解决方案都有点错误。在第一个例子中,您需要在函数参数中使用
&$error
(否则,$error将不会在“调用”范围中更新),并且就第二个例子而言,我确实可以避免不必要地使用全局变量。您的第二个例子将无法按预期工作-默认情况下,变量是按值传递的,你的全局$错误不会改变你在函数中所做的任何事情。我也投票支持你的详细答案。不奖励你是不对的。嗯,有趣的评论会把这些担忧铭记在心。@middaparka和Maelyn。不知道我一开始是怎么写的!全局变量并不是世界上所有问题的答案:它们可能导致的问题比它们解决的问题要多,而且当函数参数和返回值更正确时,不建议使用全局变量approach@Ashwini你的两个解决方案都有点错误。在第一个例子中,您需要在函数参数中使用
&$error
(否则,$error将不会在“调用”范围中更新),并且就第二个例子而言,我确实可以避免不必要地使用全局变量。您的第二个例子将无法按预期工作-默认情况下,变量是按值传递的,你的全局$错误不会改变你在函数中所做的任何事情。我也投票支持你的详细答案。不奖励你是不对的。嗯,有趣的评论会把这些担忧铭记在心。@middaparka和Maelyn。不知道我一开始是怎么写的!我已经编辑过了。谢谢,伙计,回答得很好。我仍在努力应对这一事实,即这是一个范围问题。对我来说似乎不合逻辑/不切实际。@Daniel一开始可能是这样的——但只要把它看作是试图将变量的“局部性”保持在绝对最小值即可。(换句话说,作为一种获得最高层次的分离/隔离的手段,这总是一件好事,当你遇到这样的事情时,你会发现。)快乐旅行!:-)不过,公平地说,我对ActionScript非常有经验,并且做过适量的C#,而且他们两人都从未遇到过这样严格的范围界定问题,即他们无法看到函数外声明的变量。谢谢,伙计,回答得很好。我仍在努力应对这一事实,即这是一个范围问题。对我来说似乎不合逻辑/不切实际。@Daniel一开始可能是这样的——但只要把它看作是试图将变量的“局部性”保持在绝对最小值即可。(换句话说,作为一种获得最高层次的分离/隔离的手段,这总是一件好事,当你遇到这样的事情时,你会发现。)快乐旅行!:-)不过,公平地说,我对ActionScript非常有经验,并且做过适量的C#,而且他们两人都从未遇到过这种严格的范围界定问题,即他们无法看到在函数外部声明的变量。