我有以下代码,它由类DB
组成,它使用mysqli与SQL数据库建立连接。
<?php
class DB
{
private $mysqlilink;
private $errors;
function __construct($errors = array())
{
$this -> errors = $errors;
$this -> connect();
}
function connect()
{
$server = "127.0.0.1";
$user_name = "un";
$password = "pw";
$database = "db";
if ($this -> mysqlilink == null)
{
$this -> mysqlilink = new mysqli($server, $user_name, $password, $database);
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
}
return $this -> mysqlilink;
}
function __destruct()
{
$stmt -> close();
}
}
?>
我计划使用至少一个类(在自己的脚本文件中)使用专用的PHP函数来访问网站各个部分的数据库。导入上面的脚本后,如何链接到它并通过对象的连接调用数据库?我使用以下代码:
<?php
include_once("connect.php");
class PageFunctions
{
function printText()
{
if ($stmt = $this -> mysqlilink -> prepare("SELECT Text, MoreText FROM mytext WHERE id = 1"))
{
$stmt -> execute(); $stmt -> store_result();
$rows = $stmt -> num_rows;
if ($rows == 0) { return 'Database Not Found'; }
else
{
$stmt -> bind_result($returnedText, $moreReturnedText); // Output variable(s)
while ($stmt -> fetch()) // Return results
{
return 'First text: ' . $returnedText . ' Second text: ' . $moreReturnedText;
}
}
$stmt -> free_result();
return;
}
else { printf("Prepared Statement Error: %s\n", $this -> mysqlilink -> error); }
}
}
?>
重申一下,我需要将第一个代码示例用作在多个其他类/代码文件(如第二个代码示例)中形成对象的类。由于我是PHP面向对象的新手,所以我无法成功实现这一点,所以在我提出一个糟糕的解决方案之前,我想我会请一些专家建议。
答案 0 :(得分:3)
听起来你正在寻找依赖注入。还有其他方法,但这是最好的做法。
//create an object of the DB class
$DB = new DB();
//create a PageFunctions object and pass the DB object into it as a dependency
$PF = new PageFunctions($DB);
//call your function from PageFunctions
$PF->myFunction();
//follow these concepts and do whatever you want!
您可以通过设置PageFunctions的构造函数来完成这项工作:
class PageFunctions() {
//we don't want to accidentally change DB, so lets make it private;
private $DB;
//this is the class constructor
//the constructor is called when instantiating the class - new PageFunctions()
public function __construct(DB $DB) {
//now the DB object is available anywhere in this class!
$this->DB = $DB;
}
//sample function
public function myFunction() {
$this->DB->connect();
}
}
因此,任何时候你需要在另一个类中使用一个类,创建它的一个实例(对象)(或使用一个现有的类)并在创建它的实例时将它传递给需要它的新类。
您可能会看到使用依赖注入容器完成此行为,但它仍然是相同的概念,系统和结果。它只是抽象了一点。正如你在我的解释中可能已经注意到的那样,如果你有很多依赖于其他类的类,那些依赖于其他类等的类,那么手动创建实例并将它们传入它们会非常压倒。依赖注入容器是很好,因为它可以让你告诉它如何制作每个类,然后它将完全放在一起。