PHP函数的作用域

PHP函数的作用域,php,function,scope,Php,Function,Scope,我有一个文件将我的可重用函数关联到一个文件中(functions.php)。在需要它的每一页上都包含一次()。当我的自定义函数试图访问自己作用域之外的MySQL连接时,我遇到了一个错误。源代码有点像这样: <?php // functions.php $connect = mysql_connect("localhost", "user", "pass") or die("MySQL said: ".mysql_error()); mysql_select_db("

我有一个文件将我的可重用函数关联到一个文件中(
functions.php
)。在需要它的每一页上都包含一次()。当我的自定义函数试图访问自己作用域之外的MySQL连接时,我遇到了一个错误。源代码有点像这样:

<?php
    // functions.php
    $connect = mysql_connect("localhost", "user", "pass") or die("MySQL said: ".mysql_error());
    mysql_select_db("database", $connect) or die("MySQL said: ".mysql_error()); // no error

    /* ... */

    function getmotd($user) {           
        $query = "SELECT cid FROM `users`
        WHERE id = ".$user;
        $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource
        /* ... */
    }
?>

为什么我的函数不能访问在其作用域上方声明的变量?我可以通过在函数中复制
$connect
的声明来获得成功的连接

了解我如何解决这个问题或我在这里做错了什么吗?

使用关键字

范例

function getmotd($user) {  
     global $connect;
    $query = "SELECT cid FROM `users`
    WHERE id = ".$user;
    $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource
    /* ... */
}
你也可以这样做

function getmotd($user) {  
    $query = "SELECT cid FROM `users`
    WHERE id = ".$user;
    $query = mysql_query($query, $GLOBALS['connect']); // error occurs here, $connect is not a valid MySQL link-resource
    /* ... */
}

如果您想要生成可重用的代码,那么使用OOP可能会更好。为数据库创建一个类,并为数据库信息添加一些属性,然后使用
this
关键字从函数中访问这些属性。

您无法访问$connect,因为它超出了函数的范围;也就是说,PHP只能在函数中看到变量。您可以使用global关键字让PHP知道变量超出了Kemal建议的函数范围,但我认为更好的做法是将连接传递到函数中。这将为您提供更好的封装。如果您学习通过传递所需的资源和数据来编写函数(以及更高版本的类)(一种称为“依赖项注入”的实践),您将发现您拥有更干净、更易于维护的代码。下面是一个例子:

function getmotd($db, $user) {
    $query = "SELECT cid FROM users WHERE id = " . (int)$user;
    $result = mysql_query($query, $db);
    /.../
}

$connect = mysql_connect(...);
mysql_select_db(...);
$motd = getmotd($connect, $user);

希望这有帮助。

@t您完全可以将连接变量传递给一个函数,而不使用
global
,这被认为是更好的做法。看提摩太的答案,而不是这个。