2012-12-29 260 views
0

我想重构一些代码,但我有点困惑。我定义我的数据库连接,如下所示:我可以将一个变量传递给一个函数吗?

try{ 
    global $conn; 
    $conn = new PDO("mysql:host=$host",$root,$pw); [...] 

现在我想检索表行的功能,但它需要$conn。有什么办法可以让$conn进入这个功能?我试图将其设置为默认值,但不工作:

function get($table,$conn=$conn,$limit=10){ [...] 

然后我尝试了use关键字,但我认为这是仅适用于匿名函数:

function get($table,$limit=10)use($conn){ 
    $query = $conn->query(" [...] 

如何做其他人做这个?我在这里错过了很明显的东西吗

+0

这不是一个局部变量,所以你可能想改进你的问题的措辞,所以它听起来没有误导。 – hakre

+0

你说得对,我编辑了它。让它成为全球化是我急于进入功能的绝望尝试。 – RubenGeert

+1

理想情况下,你的'get'函数应该是与'$ conn'属性相同的类的一个方法。通过这种方式可以通过以下方式访问:'$ this-> conn' –

回答

4
function get($table, $limit=10) 

正如你已经在你的问题中写道,这个函数头是不完整的。如果没有$conn,该功能本身就无法完成它所需要的功能。

由于这是在全局命名空间的功能,最简单的事情可能是使用全局变量:

function conn_get($table, $limit=10) { 

    global $conn; 

我也命名空间的功能,使关系明确。这样做的问题是两件事情:

  1. 全球职能是维持
  2. 全局变量保持

所以你通常做在这种情况下,是包装成一类这个很贵很贵:

class Conn 
{ 
    private $conn; 

    public function __construct(PDO $conn) { 

     $this->conn = $conn; 
    } 

    public function get($table, $limit=10) { 

     $query = $this->conn->query("[...]"); 
     ... 
    } 
} 

然后,通过在其周围可以使用Conn对象:

$pdo = new PDO("mysql:host=$host", $root, $pw); 
$conn = new Conn($pdo); 

然后:

$conn->get('ColorTable', 200); 

私有变量接管与同一对象内的每个方法都可以访问它的利益的全局变量的作用。所以现在的一切都在它自己的空间里,与全球空间背道而驰,不会像对方那样快速。随着时间的推移,这很容易(更容易)改变和维护。

+0

Thx为解释!它也在工作! – RubenGeert

0

当你调用的函数,即:

$table_rows = get($table, $conn); 

您传递函数范围内的局部变量。

但是,您不能将默认的非静态变量定义为:$conn=$conn会引发致命错误。

0

你可以做最简单的事情就是创建一个将返回的$conn变量

function conn(){ 
    $conn = NULL; 
    ...some database connection setup etc... 
    return $conn; 
} 

,并打电话给你需要使用它

function getDb(){ 
conn()->query(" [...]"); 
} 

其他功能的功能conn()功能将可用于您的PHP脚本的所有功能。

但是,如果您打算制作更复杂的Web应用程序,我建议您使用PHP框架或创建PHP类并应用OOP原则来处理数据库连接。

+1

您刚刚用一个全局函数替换了一个全局变量 - 如果没有广泛地讨论它的优点和缺点,看起来似乎不正确。 – hakre

+0

我只是直截了当地回答,以及OP说他希望将一个变量传递给函数,但在我的回答中,我建议他必须使用PHP框架或创建一个PHP类,它指的是更好的答案。 –

0

在PHP中,use是匿名/ lambda函数的使用方式,但不适用于普通函数。

如果数据库连接在全球范围内飞来飞去,你可以把它作为一个正常的变量,你的功能,像这样:

function get(PDO $conn, $table,$limit=10) { 
    $query = $conn->query(" [...] 
} 

除此之外(!不好的做法)是获得全球$conn可变进功能,像这样:

function get($table,$limit=10) { 
    $query = $GLOBALS['conn']->query(" [...] 
} 

但是,我们建议采用面向对象的方法!您可能需要inject the Database Class via dependency injection进入您需要的类别。

相关问题