9

我是 php 新手(但长期使用其他语言的开发人员),我正在尝试“PHP、MySQL 和 JavaScript”中的一些示例数据库连接。它显示了一个包含数据库连接变量(服务器名、用户名、密码、数据库等)的示例文件。我有一个 php 文件,其中包含我编写的一些函数,其中一个有一些 SQL 查询。无论出于何种原因,在该文件中调用 require_once 都不会输出任何错误(我已配置 E_ALL),但我的数据库 php 文件中的这些变量为空。

我用该函数中的所有变量调用了一个 echo 来查看到底发生了什么,当然它会打印一个空行。世界上有什么超出范围的?我必须缺少一些简单的东西。

这是我正在做的一个例子

db_login.php

<?php
    $db_server = 'localhost';
    // ....
?>

函数.php

<?php
    require_once('db_login.php');

    function myfunction() {
        echo "$db_server";
        // ...
    }
?>

叫我疯了,但这不应该简单到可以工作吗?

4

3 回答 3

8

PHP没有函数作用域,因此您无法访问.db_login.phpfunctions.php

有多种方法可以处理这个问题。由于您可能使用服务器名称全局常量可能是一个很好的解决方案,因为没有什么可以改变它们。

在您的情况下,您可以执行以下操作:

<?php
    require_once('db_login.php');
      // You have access to $db_server here.
      // Create a constant.
    define("DB_SERVER", $db_server);

    function myfunction() {
          // Using a constant. Note that there is no "$".
        echo DB_SERVER ;
          // Constants are interpreted inside double quotes too
        echo "\nMy constant is DB_SERVER";
        // ...
    }
?>

在您的情况下,将服务器名称作为常量可能是合适的。如果您正在处理您想将其视为真实变量的东西,您可以通过值或引用将变量传递给函数:

myfunction($variable);

  // by value
function myfunction($pass_variable_to_me_by_value)
{
    echo $pass_variable_to_me_by_value;
    // ...
}

function myfunction(& $pass_variable_to_me_by_reference)
{
    echo $pass_variable_to_me_by_reference;
    // ...
}

请注意,在您的情况下,在函数中使用global关键字或$GLOBALS数组与通过引用传递基本相同。,但是如果您不是从全局范围传递,它们可能会非常不同(例如,在一个类中或从另一个函数中)。

于 2010-09-01T04:29:35.400 回答
6

您在其中声明的变量db_login.php是全局变量。为了在您的函数中访问它们,您需要使用$GLOBALS变量,例如,或使用关键字$GLOBALS['db_server']在您的函数中将它们声明为全局,例如。globalglobal $db_server

于 2010-09-01T04:21:39.707 回答
5

在函数“myfunction”内部,您无权访问这些变量...

查看更多: http: //php.net/manual/en/language.variables.scope.php

于 2010-09-01T04:20:28.180 回答