2016-12-07 89 views
1

我是很新的面向对象,我有一个快速的问题:如何在其他类中调用类?

我有我的代码中使用以下类别:

Class DB { 
//contains all my mysqli stuff 
} 

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

如何创建,而无需创建类内部的连接每个函数都有一个新的数据库实例?

这甚至可能吗?

在此先感谢。

+1

为什么不使用'__construct()'函数? – Blueblazer172

+0

关于你的数据库类,我想下面的阅读对你有用:[你的第一个数据库包装的儿童疾病](https://phpdelusions.net/pdo/common_mistakes) –

回答

-2

对于class DB,您可以设置您的数据库连接,例如打开&关闭。对于class A,您可以使用extends将该类设置为继承class DB的方法。由于您不需要从外部访问您的班级,因此我已将class DB中的方法(程序中的功能)更改为protected,因为在PHP中默认情况下所有方法都是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 

    } 

} 

从类创建对象

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

输出调用类

Open connection to DB 
Data Select Here! 
Connection Closed 

阅读材料:

0

有一堆答案在这里,在技术上回答这个问题,但他们都教不正确的做法。良好的面向对象设计的一大部分是赞成构造而不是继承。

如果您的A类是需要与数据库一起工作的模型,那么让该类扩展为DB是一个非常糟糕的主意。相反,你只是想传递DBA的构造:

class A { 

    protected $db; 

    function __construct(DB $db) { 

     $this->db = $db; 

    } 

} 

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

这也解决了其开放的A每个实例很多数据库连接的问题(或将来,如果你需要一个BC类)。

A本身不应该创建自己的DB实例,但这应该不是得到通过注入无论构建A.这就是所谓的依赖注入和良好的面向对象设计的另一个原则。

+0

而不是彻头彻尾的说“这真是一个坏主意”和downvoting,对你来说,为什么'extend'不正确,所以我们都可以学习。真的只是一个想法。另外,不要忘记... OP是相当新的面向对象,使用可视性如'extends'是学习的关键。 – Kitson88

+0

@ Kitson88数据库访问是一个非常特殊的情况。 –

+0

@ Kitson88了解'extend'非常重要,我同意。但是,像这样的任何问题的默认工具应该是组合的,并且只有当它绝对有意义时才延伸。如果您想了解更多,请查看SOLID设计并搜索术语“合成继承”。这应该是一个非常好的谷歌关键字。 – Evert