2011-09-17 52 views
4

我有一个文件将我的可重用函数集中到一个文件中(functions.php)。它在每个需要它的页面上都是include_once()'d。当我的自定义函数试图访问自己范围之外的MySQL连接时,出现错误。来源有点像这样:PHP函数的范围

<?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的声明之内获得成功的连接功能。

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

回答

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 
    /* ... */ 
} 

如果你想重复使用的代码,你很可能与OOP最好你也可以像下面这样做

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 
    /* ... */ 
} 

。为数据库创建一个类,然后为数据库信息添加一些属性,并使用this关键字从函数中访问它们。

+0

完美!非常感谢。答案将在8分钟后被接受。 – esqew

+0

+1正确的答案。你不能没有'全球' –

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); 

希望这会有所帮助。

+0

+ 1我应该想到这个方法首先... –