Php 为多个函数声明全局对象
因此,我有一个在web应用程序中使用的函数列表。但是,大多数函数都会调用数据库类。以下是两个函数,例如: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");
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
类之外,我看不到任何信息。在所有这些类中,他都应该根据您的答案创建一个新的数据库连接。