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

Php 为多个函数声明全局对象,php,object,mysqli,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");

因此,我有一个在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);

}

有多种方法可以处理此问题,但最佳的实现可能会因action应用程序的结构和需求而异

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

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();
但是,您也可以决定使这些
方法成为静态的
方法,您可以将
$db
传递给类构造函数并存储它,有很多选择

您还可以自己创建一个返回连接的中心包装器类。有一百万种实现,但如果不了解更多关于应用程序结构、类如何共享资源、应用程序如何引导一切的信息,就很难具体推荐一种实现。Etc

试试这个:

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

我希望你不是认真的。为每个类创建一个单独的db连接?如果他只使用这个类的一个实例,正如我个人对他的问题的解释,这就可以了。如果他使用多个实例,那么显然依赖注入或某种获取单个db实例的中心方法更好。这不是他应用程序中的唯一类。很可能,然而,除了他使用的
MysqliDb
类之外,我看不到任何信息。在所有这些类中,他都应该根据您的答案创建一个新的数据库连接。