PHP功能的范围

esq*_*qew 4 php scope function

我有一个文件,将我可重用的函数存入一个文件(functions.php).这是include_once()每个需要它的页面.当我的自定义函数试图访问自己范围之外的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
        /* ... */
    }
?>
Run Code Online (Sandbox Code Playgroud)

为什么我的函数访问变量不能在它的范围之外声明?通过函数中复制$connect声明,我可以获得成功的连接.

任何洞察我如何解决这个或我在这里做错了什么?

Kem*_*lah 6

使用global 关键字.

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
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样做

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
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

如果你想制作可重复使用的代码,那么使用OOP可能会更好.为数据库创建一个类,并为数据库信息添加一些属性,并使用this关键字从函数中访问它们.


Tim*_*thy 5

您无法访问$ 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);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.