【问题标题】:PHP Function says global variable defined in previous function is undefined [duplicate]PHP函数说在以前的函数中定义的全局变量是未定义的[重复]
【发布时间】:2014-01-22 15:27:38
【问题描述】:
function connectMySQL()
{
    $link = mysqli_connect("localhost", "", "", "");

    global $link;
    return $link;
}

function checkCredentials($username, $password)
{
    connectMySQL();

    print_r($link);
}

使用 checkCredentials 函数时,出现以下错误:

注意:未定义变量:C:\xampp\htdocs\zone\funcs.php 中的链接

如果我将以下代码添加到 connectMySQL 函数中,则会显示所有正确的信息

print_r($link);
exit();

只是当在 checkCredentials 函数中调用该函数时,它才说它是未定义的。 我不相信这发生在我开始将代码切换到 MySQLi 之前

【问题讨论】:

  • $link 变量在 checkCredentials 函数中不存在。将函数内的行更改为 $link = connectMySQL(); 将解决此问题。阅读variable scope

标签: php function variables undefined global


【解决方案1】:

global 关键字不会将任何变量放入全局范围,而是从那里导入它们,您的函数应该看起来像这样。

function connectMySQL() {
    return mysqli_connect("localhost", "", "", "");
}

function checkCredentials( $username, $password ) {
    $link = connectMySQL();
    print_r( $link );
}

【讨论】:

    【解决方案2】:

    关键字global使 局部变量全局,而是指定给定名称引用全局可用变量。 You can read up on PHP's variable scoping here.

    尽管如此,global 的使用在大多数(如果不是所有)语言中都是不受欢迎的,应该不惜一切代价避免使用。
    除此之外,我也相信我说global 变量应该写在当前范围的顶部是对的:

    function evilFunc()
    {
        global $foo;
        $foo = 'Set value';
    }
    function anotherEvil()
    {
        global $foo;
        echo 'I am a bad function, because I use global variables, like $foo: ', $foo;
    }
    $foo = 123;
    anotherEvil();//will end its echo with 123
    evilFunc();
    anotherEvil();//echo will now show Set value instead
    

    底线:如果函数需要给定实例/值来完成其工作:将其作为参数传递。如果一组函数都需要相同的实例或值,将它们包装在一个类中,并使用属性
    我已经编写 PHP 十多年了,在那段时间里,我使用global 的次数可能少于 5 次,当然也少于 10 次。而且如果我今天再次编写该代码,我想我可能会做不同的事情......

    【讨论】:

      【解决方案3】:

      $link 超出范围。 您应该在调用 connectMySQL() 时分配一个变量。 找到下面的代码。

      function connectMySQL()
      {
          $link = mysqli_connect("localhost", "", "", "");
          return $link;
      }
      
      function checkCredentials($username, $password)
      {
          $link=connectMySQL();
      
          print_r($link);
      }
      

      【讨论】:

        【解决方案4】:

        始终使用 global 关键字在函数和方法中导入全局变量。

        $link = null; // declare global
        
        function connectMySQL() {
            global $link;      
            if (isset($link) == false) {
                $link = mysqli_connect("localhost", "", "", ""); // make global connection
            }
        }
        
        function checkCredentials($username, $password) {
            connectMySQL();
            global $link; // use global connection    
            print_r($link);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          • 1970-01-01
          • 1970-01-01
          • 2022-11-22
          • 2011-08-12
          • 2013-04-28
          相关资源
          最近更新 更多