如何调用其他类中的类?

时间:2016-12-07 14:26:26

标签: php oop mysqli

我对OOP很新,我有一个简单的问题:

我的代码中有以下类:

Class DB {
//contains all my mysqli stuff
}

Class A {
All functions within this class will need a db connection
}

如何在类中创建连接而无需在每个函数上创建新的数据库实例?

这甚至可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

这里有一堆答案在技术上回答了这个问题,但他们都在教导不正确的方法。良好的OOP设计的一个重要部分是支持组合而不是继承。

如果您的A类类似于需要使用数据库的模型,那么让该类扩展DB是一个非常糟糕的主意。相反,您只想将DB传递给A的构造函数:

class A {

   protected $db;

   function __construct(DB $db) {

       $this->db = $db;

   }

}

现在A中的每个方法都可以通过DB访问$this->db

这也解决了为A的每个实例打开多个数据库连接的问题(或将来如果您需要BC类)。

A本身不应该创建自己的DB实例,但这应该通过任何结构A来注入。这称为依赖注入和另一个好的原则OOP设计。

答案 1 :(得分:-2)

对于class DB,您可以设置数据库连接,例如开放式关。对于class A,您可以使用class DB将类设置为继承extends的方法。由于您不需要从外部访问您的类,我已将class DB中的方法(程序中的函数)更改为protected,因为默认情况下,所有方法都是public

我还添加了Constructor的使用(如评论中所述),因此当从Class A创建对象时,您的数据库连接将自动打开。就个人而言,我不会在构造函数中打开数据库连接,但这只是我的偏执狂。如果您有疑问,请确保关闭方法中的连接。

<?php

Class DB {

    protected function conDB() { //Protected can only be accessed by same class or inherited class

        echo "Open connection to DB";

    }

    protected function closeDB() { //Protected can only be accessed by same class or inherited class

        echo "Connection Closed";

    }

}

Class A extends DB { //Extends will use all methods from inherited class

    function __construct() { //Constructer will run on Object creation and open connection to DB

      $this->conDB();

    }


    public function selectDB() {

        echo "<br>";
        echo "Data Select Here!";
        echo "<br>";
        $this->closeDB(); //You will still need to close the DB Connection

    }

}

从A类创建对象

$select = new A(); //Create Object
$select->selectDB(); 

输出调用A类

Open connection to DB
Data Select Here!
Connection Closed

阅读材料: