我可以将变量传递给函数吗?

时间:2012-12-29 15:33:57

标签: php mysql

我正在尝试重构一些代码,但我有点困惑。我这样定义我的数据库连接:

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 个答案:

答案 0 :(得分:4)

function get($table, $limit=10)

正如您在问题中所写,此函数标题不完整。如果没有$conn,函数本身就无法完成它需要做的事情。

由于这是全局命名空间中的一个函数,最直接的事情可能是使用全局变量:

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

    global $conn;

我还将函数命名为间隔,以使关系清晰。这个问题有两个:

  1. 全球职能维护成本高昂
  2. 全局变量维护成本高昂
  3. 所以你通常在这种情况下做的就是把它包装成一个类:

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

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

答案 1 :(得分:0)

当您调用该函数时,即:

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

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

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

答案 2 :(得分:0)

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

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

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

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

PHP脚本上的所有函数都可以使用conn()函数。

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

答案 3 :(得分: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进入您需要的类中。