【问题标题】:How to call a class within other class?如何在其他类中调用一个类?
【发布时间】:2016-12-07 14:26:26
【问题描述】:

我是 OOP 的新手,我有一个简单的问题:

我的代码中有以下类:

Class DB {
//contains all my mysqli stuff
}

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

如何在类内部创建连接而不需要在每个函数上创建新的数据库实例?

这可能吗?

提前致谢。

【问题讨论】:

标签: php oop mysqli


【解决方案1】:

这里有很多从技术上回答问题的答案,但他们都在教错误的方法。良好的 OOP 设计的很大一部分是支持组合而不是继承。

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

class A {

   protected $db;

   function __construct(DB $db) {

       $this->db = $db;

   }

}

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

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

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

【讨论】:

  • 与其直截了当地说“这是一个非常糟糕的主意”并投反对票,不如告诉您为什么extending 不正确,这样我们都可以学习。真的只是一个想法。另外,不要忘记...OP 是相当新的 OOP,使用可见性(例如 extends)是学习的关键。
  • @Kitson88 数据库访问是一种非常特殊的情况。
  • @Kitson88 理解extend 非常重要,我同意。但是,对于此类问题,您的默认工具应该组合起来,并且只有在绝对有意义的情况下才能扩展。如果您想了解更多信息,请查看 SOLID 设计并搜索术语“组合优于继承”。这应该是一个非常好的谷歌关键字。
  • @Kitson88 您应该在这里问自己的真正问题是A 替代DB。答案可能是否定的,A 只需要能够使用来自DB 的功能。在那种情况下,使用extend总是是个坏主意。我确实认为我在答案中包含了正确的信息。我至少做了一次尝试。我可以看到,如果其中一些不熟悉,情况似乎并非如此。
  • @Evert 感谢您的回复...但我想我仍然缺少一些东西。在 A 类我有function __construct(Db $db) { $this->db = $db; } 所以要运行一个查询我应该去...`return $this->Db->select($query); ` 正确吗?
【解决方案2】:

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

我还添加了Constructor 的使用(如 cmets 中所述),因此当从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

阅读材料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多