为了账号安全,请及时绑定邮箱和手机立即绑定

在类中使用全局变量

在类中使用全局变量

繁华开满天机 2019-07-09 15:11:11
在类中使用全局变量我正在尝试创建一个分页类,并从类外部使用一个变量。但是它给了我致命的错误“调用非对象上的成员函数Query()”。这是索引文件:$db = new DB_MySQL("localhost", "root", "", "test");  // connect to the databaseinclude_once("pagi.php");  $pagination = new pagi();$records = $pagination->get_records("SELECT * FROM `table`");这是pagi.php文件:class pagi {     public function get_records($q) {         $x = $db->query($q);         return $db->fetch($x);     }}是否可以从类的外部使用这个变量,而无需在类中创建一个新变量?
查看完整描述

4 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

虽然我确实同意依赖模型很好,但是对于数据库,我个人使用一个静态连接,它可以用于数据库类的所有实例和CREATE实例,以便在需要时进行查询。以下是一个例子:

<?php//define a database classclass DB {
    //the static connection.
    //This is available to all instances of the class as the same connection.
    private static $_conn;

    //store the result available to all methods
    private $result;
    //store the last query available to all methods
    private $lastQuery;

    //static connection function. connects to the database and stores that connection statically.       
    public static function connect($host, $user, $pass, $db){
        self::$_conn = mysqli_connect($host, $user, $pass, $db);
    }

    //standard function for doing queries. uses the static connnection property.
    public function query($query){
        $this->lastQuery = $query;
        $this->result = mysqli_query(self::$_conn, $query);
        //process result, return expected output.
    }}//create connection to the database, this connection will be used in all instances of DB classDB:
    :connect('local', 'DB_USER', 'DB_PASS');//create instance to query$test = new DB;
    //do query$test->query("SELECT * FROM TABLE");//test functionfunction foo(){
    //create instance to use in this function
    $bar = new DB;
    //do query
    $bar->query("SELECT * FROM OTHER_TABLE");
    //return results
    return $bar->fetchArray();}

这样,我就可以在任何函数、方法.等中创建所有我想要的DB实例,并使用该类的本地实例来执行所有查询。所有实例都使用相同的连接。

但是要注意的一点是,这只允许每个定义的类连接到数据库,但是我只使用一个,所以这对我来说不是问题。


查看完整回答
反对 回复 2019-07-09
?
智慧大石

TA贡献1946条经验 获得超3个赞

可以添加db连接($db)的调用。get_records方法:

这里只有相关的代码行:

第一个文件:

$records = $pagination->get_records("SELECT * FROM `table`", $db);

第二个档案:

public function get_records($q, $db) {


查看完整回答
反对 回复 2019-07-09
?
SMILET

TA贡献1796条经验 获得超4个赞

到目前为止,其他答案肯定比使用全局方法更可取,因为这会破坏您的封装(例如在调用该方法之前需要定义该对象)。

在方法签名或不使用类中强制执行这一点要好得多。


查看完整回答
反对 回复 2019-07-09
  • 4 回答
  • 0 关注
  • 1125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信