【问题标题】:Simple PHP Function Boolean Problem简单的 PHP 函数布尔问题
【发布时间】:2011-08-06 21:48:22
【问题描述】:

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

?>

【问题讨论】:

  • 除了变量作用域,还要阅读函数的返回值
  • 它只是在同一页面上的一个函数中,这肯定不会是变量范围的问题吗?猜我错了我会读的。

标签: php function boolean


【解决方案1】:

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

阅读范围here。将您的功能更改为:

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

验证用户名($用户名);

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

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

【讨论】:

  • 全局变量并不是解决世界上所有问题的答案:它们可能会导致比它们解决的问题更多的问题,并且在函数参数和返回值更正确时不推荐使用接近
  • @Ashwini 你的两个解决方案都有点不对劲。在第一个中,您需要在函数参数中使用&amp;$error(否则, $error 不会在“调用”范围内更新),我会真的避免不必要地使用就第二个而言是全球性的。
  • 您的第二个示例将无法按预期工作 - 默认情况下,变量是按值传递的,您的全局 $error 不会改变您在函数内执行的任何操作。
  • 我也投票支持你的详细答案。不给你奖励感觉不对。嗯,有趣的 cmets 会牢记这些担忧。
  • @middaparka 和 Maelyn。不知道我是怎么写的!已编辑。
【解决方案2】:

这不起作用,因为$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.';
    } 
?>

【讨论】:

  • 谢谢小伙子,很好的回答。我仍在努力应对这是一个范围界定问题的事实。对我来说似乎不合逻辑/不切实际。
  • @Daniel 最初看起来可能是这样 - 但只需将其视为试图将变量的“局部性”保持在绝对最小值。 (换句话说,作为获得最高级别的分离/隔离的一种手段,这总是一件好事,当您遇到object-oriented programming之类的事情时您会发现。)祝您旅途愉快! :-)
  • 公平地说,我在 ActionScript 方面非常有经验,并且已经完成了适量的 C#,而且他们都没有遇到过这样严格的范围界定问题,即他们看不到在外面声明的变量一个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2020-11-21
  • 2018-09-25
  • 1970-01-01
  • 2016-08-27
  • 2022-06-16
相关资源
最近更新 更多