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(" [...]

其他人如何做到这一点?我在这里遗漏了一些明显的东西吗?

4

4 回答 4

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

私有变量接管了全局变量的角色,其好处是同一对象内的每个方法都可以访问它。所以现在一切都在它自己的空间中,与全局空间相反,不会那么快地进入对方。随着时间的推移,这很容易(更容易)更改和维护。

于 2012-12-29T15:42:10.053 回答
0

当您调用该函数时,即:

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

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

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

于 2012-12-29T15:38:12.120 回答
0

您可以做的最简单的事情是创建一个函数,该函数将返回$conn变量

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

并将其调用到您需要使用它的其他功能

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

conn()函数将可用于您的 PHP 脚本中的所有函数。

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

于 2012-12-29T15:38:21.437 回答
0

在 PHP 中,use是匿名 / lambda 函数的方式,而不是普通函数。

如果您的数据库连接在全局范围内飞来飞去,您可以将其作为普通变量传递给您的函数,如下所示:

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

除此之外(不好的做法!)是将全局$conn变量放入函数中,如下所示:

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

但是,推荐使用面向对象的方法!您可能希望通过依赖注入将数据库类注入到您需要的类中。

于 2012-12-29T15:40:38.170 回答