为多个函数声明一个全局对象

时间:2014-02-07 22:08:18

标签: php object mysqli

所以我有一个我在Web应用程序中使用的函数列表。但是,大多数函数都会调用数据库类。以下是两个函数:

function add_post($userid,$body,$cat_id,$user_link){            //This function inserts new posts into the db

$db = new MysqliDb('localhost', 'root', 'root', 'my_db');
$now = date("Y-m-d H:i:s");

$insertData = array(
   'user_id' => $userid,
    'body' => $body,
    'stamp' => $now,
    'cat_id' => $cat_id,
    'link' => $user_link
    );

$db->insert('posts', $insertData);

}



function grab_username($userid){                    //This function takes a user id, and returns the associated user_name

$db = new MysqliDb('localhost', 'root', 'root', 'my_db');

$params = array($userid);
$results = $db->rawQuery("SELECT username FROM users WHERE id = ?", $params);

//print_r($results);

foreach($results as $arrays){

    foreach($arrays as $name){
        return $name;
    }
   }

}

问题是我经常写这句话:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db');

有没有办法可以全局声明变量,有更多类似的东西:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db');

function add_post($userid,$body,$cat_id,$user_link){            //This function inserts new posts into the db

$now = date("Y-m-d H:i:s");

$insertData = array(
   'user_id' => $userid,
    'body' => $body,
    'stamp' => $now,
    'cat_id' => $cat_id,
    'link' => $user_link
    );

  global $db->insert('posts', $insertData);

}

2 个答案:

答案 0 :(得分:0)

有多种方法可以解决这个问题,但最佳实施方式可能因操作应用程序的结构和需求而异。

您提到了一个可行的全局变量,但通常被认为是不良结构:

someFunction(){
  global $db;
  $db->insert('posts', $insertData);
}

另一种方法虽然稍微清晰但组织得不好,但是将$db连接传递给函数:

function myFunction( $db, ... ){
    $db->query( // etc );
}
myFunction( $db );

更好的版本是在类中组织相关的函数,然后注入数据库:

class Posts {
  public function listPosts( $db, ... ){
    $db->query( // etc );
  }
  public function getPost( $db, ... ){
    $db->query( // etc );
  }
}

$posts = new Posts();
$posts->listPosts();

但是,你也可以决定制作这些static方法,你可以将$db传递给类构造函数并存储它,有很多选择。

您还可以创建自己的中央包装类,以返回连接。有一百万个实现,但很难在不了解您的应用程序结构,类如何共享资源,应用程序如何引导所有内容的情况下专门推荐一个实现 - 如果有的话。等

答案 1 :(得分:-1)

试试这个:

<强> db.php中

class DB
{

   public $conn;
   private static $instance;

   private function __construct()
   {
     $server = 'localhost';
     $user = 'root';
     $pass = 'root';
     $database = 'my_db';

     $this->conn = mysqli_connect($server,$user,$pass,$database);
   }

   public function query($sql)
   {
     $result = mysqli_query($this->conn,$sql);
     return $result;

   }

   public static function getInstance()
   {
     if (!isset(self::$instance))
     {
         $object = __CLASS__;
         self::$instance = new $object;
     }
     return self::$instance;
   }
}

现在,您可以在任何页面中执行以下操作:

require("db.php");
$dbh = DB::getInstance();
$sql = "your sql query ..";
$dbh->query($sql);