如何使用OOP将另一个.php的$ db用于另一个.php的类?

时间:2016-01-13 01:14:11

标签: php mysql oop mysqli

我是OOP PHP的新手,我已经开始使用程序API,因为我已经开始进行Web开发,所以我很难迁移到OOP。

所以,让我们说下面有四个.php文件和结构。

  

connection.db.php

<?php
    define("DB_HOST", "127.0.0.1");
    define("DB_USER", "root");
    define("DB_PASS", "");
    define("DB_NAME", "sample_db");

    $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

    echo (!$db->connect_error) ? NULL : die("<pre>Unable to connect to the MySQL Server -> $db->connect_error</pre>");
?>
  

sampleclass.class.php

<?php
    public $db;

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

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

includes.inc.php

<?php
    error_reporting(0);
    date_default_timezone_set("Asia/Manila");

    require 'connection.db.php';
    require 'sampleclass.class.php';
?>
  

的index.php

<?php
    require 'includes.inc.php';

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

您可能或可能没有注意到,我的问题是如何使用$db connection.db.phpsamplefunction的{​​{1}}

你可能会问我,为什么不在sampleclass.class.php中创建一个sampleclass.class.php方法,只需移动&#34; $ db = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);&#34 ;那里 ?。好吧,如果我这样做,所有其他课程必须让它自己的__construct()constructor声明在那里吗?

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);上的$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);我假设我可以多功能地重复使用它。

你知道我在connection.db.php宣布了public $db;,但我不知道接下来会发生什么。如果有人可以帮助我,那么我会非常感激。

PS:我已经咨询了谷歌博士博士。关于这个问题,我只收到大量的文章或视频教程,展示了如何使用和进行OOP PHP-MySQLi编程,但没有使用类和方法。

3 个答案:

答案 0 :(得分:8)

您最好创建一个DB课程或利用已创建的课程来实现您的目标。

像这样的事情的通常流程是Lazy Loading/Dependency Injection。您将所需对象传递到课程中的位置。

如果您选择此路径,我建议您阅读依赖注入,就像许多事情一样,它有优点和缺点,但在OOP中是必不可少的。 < / p>

As Ben Stated in the comments

  

依赖注入是OOP中的一个关键原则。我想补充一点   如果你认真对待OOP,你还应该考虑autoloaders in generalPSR-4Composer

如果不是上面提到的一方,你最好查看PHPTheRightWay,他们会列出很多的内容,包括Dependency Injection

你最终会创造类似的东西。如果你按照这个例子来理解它的工作方式会更好:

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...
}

无论如何,你可以构建这个。或者只是让mysqli对象可访问,允许您调用它。

现在我们了解有趣的东西。实际上把它注入你的班级;

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.

如果您只想分享资源,可以利用global,但强烈建议不要

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

如果您选择此路径,则最好将global $db实例分配给内部类变量,例如$this->db

答案 1 :(得分:5)

当您使用对象时,您可能还应该进行OOP(面向对象编程)实现。

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

class MysqlConn
{
    public static $db;
}

就像使用此代码实例化mysqli对象一样:

MysqlConn::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

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

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

index.php 中,您可以使用以下代码获取数据库实例,而不是每次都重新连接:

$db = MysqlConn::getDB();

答案 2 :(得分:0)

  

我的问题是如何使用来自connection.db.php的$ db   sampleclass.class.php的样本函数

你可以在你的情况下使用global只是include或者需要connection.db.php然后在php中使用global

这样的事可能会对你有所帮助

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