Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将$db从另一个.php使用到另一个.php';s类使用OOP?_Php_Mysql_Oop_Mysqli - Fatal编程技术网

如何将$db从另一个.php使用到另一个.php';s类使用OOP?

如何将$db从另一个.php使用到另一个.php';s类使用OOP?,php,mysql,oop,mysqli,Php,Mysql,Oop,Mysqli,我是OOP PHP新手,自从我开始Web开发以来,我一直在使用过程API,所以我很难迁移到OOP 假设下面有四个.php文件和结构 connection.db.php sampleclass.class.php includes.inc.php index.php 您最好创建一个DB类,或者利用已经创建的类来实现您想要做的事情 对于这样的事情,通常的流程是调用。将所需对象传递到类中的位置 如果你选择这条路,我建议你仔细阅读依赖注入,就像很多事情一样,它有优点和缺点,但在OOP中是必不

我是OOP PHP新手,自从我开始Web开发以来,我一直在使用过程API,所以我很难迁移到OOP

假设下面有四个
.php
文件和结构

connection.db.php


sampleclass.class.php


includes.inc.php


index.php


您最好创建一个
DB
类,或者利用已经创建的类来实现您想要做的事情

对于这样的事情,通常的流程是调用。将所需对象传递到类中的位置

如果你选择这条路,我建议你仔细阅读依赖注入,就像很多事情一样,它有优点和缺点,但在OOP中是必不可少的

: 依赖注入是OOP中的一个关键原则。我想补充一点 如果你对OOP是认真的,你也应该研究,和

你最好看看上面没有提到的那一面,它们列出了很多东西,包括

你最终会创造出类似的东西。如果您遵循此示例了解其工作原理,则会更好:

   require_once 'connection.db.php';

        class MySQLqueries {
                public function samplefunction($queryString) {
                    global $db;
                    //You can now use $db variable as you want
                    print_r($db);
                    $sqlQry = mysqli->query($queryString);

                    return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>");
                }
        }
你可以随意构造它。或者只需访问
mysqli
对象,就可以调用它

现在我们来谈谈有趣的事情。把它注入你的课堂

class MysqlConn
{
    public static $db;
}

如果您只想共享资源,您可以利用
全局
,但强烈建议不要这样做

MysqlConn::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
include('connection.db.php');
类mysqlquerys{
公共函数samplefunction($queryString){
全球$db;
$sqlQry=mysqli->query($queryString);
return($sqlQry)-“查询执行成功”:die(“发生错误->$db->error”);
}
}
如果选择此路径,最好将
$db
global
实例分配给内部类变量,如
$this->db

我的问题是如何在 sampleclass.class.php的samplefunction

您可以在本例中使用全局,只需包含或要求
connection.db.php
,然后在php中使用
global

像这样的东西可能对你有帮助

require_once'connection.db.php';
类mysqlquerys{
公共函数samplefunction($queryString){
全球$db;
//现在可以根据需要使用$db变量
印刷费(db);
$sqlQry=mysqli->query($queryString);
return($sqlQry)-“查询执行成功”:die(“发生错误->$db->error”);
}
}

由于您一直在使用对象,您可能还应该使用OOP(面向对象编程)实现

因此,您可以将
$db
变量作为静态变量放入sampleclass.class.php文件中,如下所示:

与此类似,您可以使用以下代码实例化mysqli对象:

更好的是,您可以创建一个方法来实例化$db连接,初始化该类中的变量:


+1依赖注入是OOP中的一个关键原则。我想补充一点,如果你对OOP是认真的,你也应该研究一下,还有。@BenHarold谢谢你的链接,我会把它们添加到答案中!谢谢各位。虽然我很难吸收这些东西,因为我对OOP还很陌生。你想说的是,我最好在connection.DB.php中创建一个DB类,然后将它注入到其他类中,对吗?@提问者,你最好遵循一个标准。如果您要走OOP的道路,那么拥有一个处理与数据的任何和所有交互的数据库类是绝对有意义的。这个课程基本上是你的。它保持了所有交互的一致性,应该在进行重大项目之前学习。您应该始终将数据访问层与应用程序分开。(将其视为银行账户(数据库中包含数据)的pin(DAO)。)对不起。我差点忘了。:)这有点好。但我也很难吸收它。谢谢:)我还没有测试过我的方法,它更接近你的方法,但是@darren的答案无论如何要好得多。还有,他在我写作时回答你也得到了我的投票@NunoPereira,我们在这里讨论的都是同一件事:)你刚刚采用了单例法!回答得好!这里的
global
反而降低了类的可移植性-也许
$db
最好在构造函数中发送?@halfer是的,我也这么认为,但OP的问题是
如何使用OOP将$db从另一个.php类使用到另一个.php类?
您如何直接回答它?据我所知,将它传递给构造函数或为数据库创建另一个类并将其注入另一个类不是使用
$db
变量,而是传递
$db
变量。
<?php
    require 'includes.inc.php';

    $todo = new MySQLqueries;
    echo $todo->samplefunction("SELECT `sample_column` FROM `sample_table` WHERE `sample_column` = 'sample_value';");
?>
Class DB {

    function __construct($host, $user, $pass, $db) { 
        return $this->connect($host, $user, $pass, $db); 
    }

    function connect($host, $user, $pass, $db) {
        //..connect and all.
    }

    //...the rest of your functions/class...
}
Class Foo {

    $private $db;

    // your construct method here will ONLY except a `DB` class instance/object as $db. 
    // Try it with anything else and learn from the errors to understand what I mean.
    function __construct(DB $db){
        $this->db = $db;
    }

}

$db = new DB($host, $user, $pass, $db);
// you can error check it here

$foo = new Foo($db);// inject the $db object.
include('connection.db.php');

class MySQLqueries {
        public function samplefunction($queryString) {
            global $db;
            $sqlQry = mysqli->query($queryString);

            return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>");
        }
}
   require_once 'connection.db.php';

        class MySQLqueries {
                public function samplefunction($queryString) {
                    global $db;
                    //You can now use $db variable as you want
                    print_r($db);
                    $sqlQry = mysqli->query($queryString);

                    return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>");
                }
        }
class MysqlConn
{
    public static $db;
}
MysqlConn::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
<?php
class MysqlConn
{
    protected
        static $DB_HOST = "127.0.0.1",
        static $DB_USER = "root",
        static $DB_PASS = "",
        static $DB_NAME = "sample_db";

    protected static $db;

    public static function getDB()
    {
        if (!isset(self::$db) {
            self::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

            if ($db->connect_error) {
                die("<pre>Unable to connect to the MySQL Server -> $db->connect_error</pre>");
            }
        }
        return self::$db;
    }
}

MysqlConn::getDB();
$db = MysqlConn::getDB();