在类中使用全局变量

在类中使用全局变量

我正在尝试创建一个分页类,并从类外部使用一个变量。

但是它给了我致命的错误“调用非对象上的成员函数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);
    }}

是否可以从类的外部使用这个变量,而无需在类中创建一个新变量?


繁华开满天机
浏览 1126回答 4
4回答

狐的传说

虽然我确实同意依赖模型很好,但是对于数据库,我个人使用一个静态连接,它可以用于数据库类的所有实例和CREATE实例,以便在需要时进行查询。以下是一个例子:<?php//define&nbsp;a&nbsp;database&nbsp;classclass&nbsp;DB&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//the&nbsp;static&nbsp;connection. &nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;is&nbsp;available&nbsp;to&nbsp;all&nbsp;instances&nbsp;of&nbsp;the&nbsp;class&nbsp;as&nbsp;the&nbsp;same&nbsp;connection. &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;$_conn; &nbsp;&nbsp;&nbsp;&nbsp;//store&nbsp;the&nbsp;result&nbsp;available&nbsp;to&nbsp;all&nbsp;methods &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$result; &nbsp;&nbsp;&nbsp;&nbsp;//store&nbsp;the&nbsp;last&nbsp;query&nbsp;available&nbsp;to&nbsp;all&nbsp;methods &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$lastQuery; &nbsp;&nbsp;&nbsp;&nbsp;//static&nbsp;connection&nbsp;function.&nbsp;connects&nbsp;to&nbsp;the&nbsp;database&nbsp;and&nbsp;stores&nbsp;that&nbsp;connection&nbsp;statically.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;connect($host,&nbsp;$user,&nbsp;$pass,&nbsp;$db){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::$_conn&nbsp;=&nbsp;mysqli_connect($host,&nbsp;$user,&nbsp;$pass,&nbsp;$db); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//standard&nbsp;function&nbsp;for&nbsp;doing&nbsp;queries.&nbsp;uses&nbsp;the&nbsp;static&nbsp;connnection&nbsp;property. &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;query($query){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->lastQuery&nbsp;=&nbsp;$query; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->result&nbsp;=&nbsp;mysqli_query(self::$_conn,&nbsp;$query); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//process&nbsp;result,&nbsp;return&nbsp;expected&nbsp;output. &nbsp;&nbsp;&nbsp;&nbsp;}}//create&nbsp;connection&nbsp;to&nbsp;the&nbsp;database,&nbsp;this&nbsp;connection&nbsp;will&nbsp;be&nbsp;used&nbsp;in&nbsp;all&nbsp;instances&nbsp;of&nbsp;DB&nbsp;classDB: &nbsp;&nbsp;&nbsp;&nbsp;:connect('local',&nbsp;'DB_USER',&nbsp;'DB_PASS');//create&nbsp;instance&nbsp;to&nbsp;query$test&nbsp;=&nbsp;new&nbsp;DB; &nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;query$test->query("SELECT&nbsp;*&nbsp;FROM&nbsp;TABLE");//test&nbsp;functionfunction&nbsp;foo(){ &nbsp;&nbsp;&nbsp;&nbsp;//create&nbsp;instance&nbsp;to&nbsp;use&nbsp;in&nbsp;this&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;$bar&nbsp;=&nbsp;new&nbsp;DB; &nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;query &nbsp;&nbsp;&nbsp;&nbsp;$bar->query("SELECT&nbsp;*&nbsp;FROM&nbsp;OTHER_TABLE"); &nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;results &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$bar->fetchArray();}这样,我就可以在任何函数、方法.等中创建所有我想要的DB实例,并使用该类的本地实例来执行所有查询。所有实例都使用相同的连接。但是要注意的一点是,这只允许每个定义的类连接到数据库,但是我只使用一个,所以这对我来说不是问题。

智慧大石

可以添加db连接($db)的调用。get_records方法:这里只有相关的代码行:第一个文件:$records&nbsp;=&nbsp;$pagination->get_records("SELECT&nbsp;*&nbsp;FROM&nbsp;`table`",&nbsp;$db);第二个档案:public&nbsp;function&nbsp;get_records($q,&nbsp;$db)&nbsp;{

SMILET

到目前为止,其他答案肯定比使用全局方法更可取,因为这会破坏您的封装(例如在调用该方法之前需要定义该对象)。在方法签名或不使用类中强制执行这一点要好得多。
打开App,查看更多内容
随时随地看视频慕课网APP