如何使用OOP从另一个.php到另一个.php的类使用$ db?

The*_*ner 4 php mysql oop mysqli

我是OOP PHP的新手,自从我开始进行Web开发以来,我一直在使用过程API,因此我很难迁移到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>");
?>
Run Code Online (Sandbox Code Playgroud)

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>");
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

includes.inc.php

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

    require 'connection.db.php';
    require 'sampleclass.class.php';
?>
Run Code Online (Sandbox Code Playgroud)

的index.php

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

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

正如你可能会或可能没有注意到,我的问题是如何使用$dbconnection.db.phpsamplefunctionsampleclass.class.php

您可能会问我,为什么不在__construct()sampleclass.class.php中创建一个方法,只需移动"$ db = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);" 那里 ?.好吧,如果我要这样做,所有其他课程都必须拥有它自己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我以为我可以重复使用它多才多艺-LY.

你看我已宣布进入public $db;,sampleclass.class.php但我不知道下一步是什么.如果有人可以帮助我,那么我会非常感激.

PS:我已经咨询了谷歌博士博士.关于这个问题,我只有很多文章或视频教程展示了如何使用和做OOP PHP-MySQLi编程,但没有使用类和方法.

Dar*_*ren 8

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

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

如果你选择这条路径,我建议你阅读依赖注入,就像许多事情一样,它有利有弊,但在OOP中是必不可少的.

正如Ben在评论中所述:

依赖注入是OOP中的一个关键原则.我想补充一点,如果你认真对待OOP,你还应该研究一般的自动加载器,PSR-4Composer.

不是上面提到的一方,你最好看看PHPTheRightWay,他们列出了很多东西,包括依赖注入.

你最终会创造类似的东西.如果你按照这个例子来理解它是如何工作的,那会更好:

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...
}
Run Code Online (Sandbox Code Playgroud)

你可以随意构建这个.或者只是让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.
Run Code Online (Sandbox Code Playgroud)

如果你只想分享资源,你可以利用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>");
        }
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1依赖注入是OOP中的关键原则.我想补充一点,如果你认真对待OOP,你也应该研究一下[自动加载器](http://php.net/manual/en/language.oop5.autoload.php),[PSR-4] (http://www.php-fig.org/psr/psr-4/)和[Composer](https://getcomposer.org/). (3认同)

Nun*_*ira 5

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

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

class MysqlConn
{
    public static $db;
}
Run Code Online (Sandbox Code Playgroud)

就像你使用这段代码实例化mysqli对象:

MysqlConn::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
Run Code Online (Sandbox Code Playgroud)

更好的是,您可以创建一个实例化$ 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();
Run Code Online (Sandbox Code Playgroud)

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

$db = MysqlConn::getDB();
Run Code Online (Sandbox Code Playgroud)