使用PHP的mysqli连接作为其他类的对象

时间:2014-01-29 04:28:22

标签: php oop mysqli

我有以下代码,它由类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面向对象的新手,所以我无法成功实现这一点,所以在我提出一个糟糕的解决方案之前,我想我会请一些专家建议。

1 个答案:

答案 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();
   }
}

因此,任何时候你需要在另一个类中使用一个类,创建它的一个实例(对象)(或使用一个现有的类)并在创建它的实例时将它传递给需要它的新类。

您可能会看到使用依赖注入容器完成此行为,但它仍然是相同的概念,系统和结果。它只是抽象了一点。正如你在我的解释中可能已经注意到的那样,如果你有很多依赖于其他类的类,那些依赖于其他类等的类,那么手动创建实例并将它们传入它们会非常压倒。依赖注入容器是很好,因为它可以让你告诉它如何制作每个类,然后它将完全放在一起。