PHP全局变量范围

时间:2014-02-14 20:12:21

标签: php

我有一个帮助文件,其中包含很多函数,但没有“main”函数。每个辅助函数都需要数据库连接。为了提高代码的可维护性,我想把保存数据库连接的变量放在全局状态(在任何函数之外),这样每个函数都可以看到它,并且可以在它们的mysql调用中使用它。这就是我的意思:

$path = $_SERVER['DOCUMENT_ROOT'];
$connection = $path . '/scripts/connection.php';
include ($connection); // this initializes the variable '$link'

function getLocation ($id) {
    $sql = "SELECT name FROM Locations WHERE id=$id";
    $result = mysqli_query($link, $sql);
    if (!$result) { return -1; }
    $row = mysqli_fetch_array($result);
    mysqli_close($link);
    return $row['name'];
}

function getGroupID($group_id) {
    $sql = "SELECT id FROM Groups WHERE group='$group_id'";
    $result = mysqli_query($link, $sql);
    if (!$result) { return -1; }
    $row = mysqli_fetch_array($result);
    mysqli_close($link);
    return $row['id'];
}

// and many other similar functions

我宁愿不把这三个全局行放在每个函数中,因为那时我不得不一遍又一遍地重复代码,但是这个方法没有全局范围。我可能会考虑将$link变量作为参数传递,但这需要重构很多函数调用。我知道有些人对这样的全局变量不屑一顾,但在这种情况下,这是我最简单的解决方案。

顺便说一句,如果我用这个替换三个全局线: include '../scripts/connection.php' 我的代码工作正常,但后来我失去了一些相对引用的灵活性。我不明白为什么我在这里发布的代码操作方式不同。

有没有办法可以全局声明这个$connection变量?

谢谢。

2 个答案:

答案 0 :(得分:1)

在您的功能中,使用:

global $connection

这会将变量从全局范围拉入到您的函数中。

或者,您可以查看一个ORM - 我个人最喜欢的是IDIORM,但是Doctrine和Propel也很好。

答案 1 :(得分:0)

把:

global $link;

在每个功能的开头。

另一种方法是定义一个打开连接并返回链接的函数或类。连接可以是函数中的静态变量;如果它已经设置,它不会重新打开连接:

function get_db_conn () {
    static $link;

    if ($link) {
        return $link;
    }
    $link = mysqli_connect(...);
    return $link;
}

然后您的所有其他功能都可以从以下开始:

$link = get_db_conn();