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)
正如你可能会或可能没有注意到,我的问题是如何使用$db从connection.db.php在samplefunction的sampleclass.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编程,但没有使用类和方法.
你最好创建一个DB类或利用已经创建的类来实现你想要做的事情.
像这样的事情的通常流程称为Lazy Loading/Dependency Injection.您将所需对象传递到课程中的位置.
如果你选择这条路径,我建议你阅读依赖注入,就像许多事情一样,它有利有弊,但在OOP中是必不可少的.
依赖注入是OOP中的一个关键原则.我想补充一点,如果你认真对待OOP,你还应该研究一般的自动加载器,PSR-4和Composer.
不是上面提到的一方,你最好看看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.
当您使用对象时,您可能还应该进行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)