我是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.php
中samplefunction
的{{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;
,但我不知道接下来会发生什么。如果有人可以帮助我,那么我会非常感激。
答案 0 :(得分:8)
您最好创建一个DB
课程或利用已创建的课程来实现您的目标。
像这样的事情的通常流程是Lazy Loading/Dependency Injection。您将所需对象传递到课程中的位置。
如果您选择此路径,我建议您阅读依赖注入,就像许多事情一样,它有优点和缺点,但在OOP中是必不可少的。 < / p>
依赖注入是OOP中的一个关键原则。我想补充一点 如果你认真对待OOP,你还应该考虑autoloaders in general,PSR-4和Composer。
如果不是上面提到的一方,你最好查看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>");
}
}