Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在其他类中调用一个类?_Php_Oop_Mysqli - Fatal编程技术网

Php 如何在其他类中调用一个类?

Php 如何在其他类中调用一个类?,php,oop,mysqli,Php,Oop,Mysqli,我是OOP新手,我有一个简短的问题: 我的代码中包含以下类: Class DB { //contains all my mysqli stuff } Class A { All functions within this class will need a db connection } 如何在类内创建连接而不需要在每个函数上创建新的DB实例 这可能吗 提前感谢。对于class DB,您可以设置您的DB连接,例如打开和关闭。对于类A,可以使用extends将该类设置为继承类DB的方法。由于您

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

我的代码中包含以下类:

Class DB {
//contains all my mysqli stuff
}

Class A {
All functions within this class will need a db connection
}
如何在类内创建连接而不需要在每个函数上创建新的DB实例

这可能吗

提前感谢。

对于class DB,您可以设置您的DB连接,例如打开和关闭。对于类A,可以使用extends将该类设置为继承类DB的方法。由于您不需要从外部访问类,因此我已将类DB中的procedural中的方法函数更改为protected,因为在PHP中默认情况下,所有方法都是公共的

我还添加了注释中提到的使用,这样当对象从类a创建时,您的DB连接将自动打开。就个人而言,我不会在构造函数中打开DB连接,但这只是我的妄想。如果您有疑问,请确保关闭方法中的连接

<?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

阅读材料:


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

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

class A {

   protected $db;

   function __construct(DB $db) {

       $this->db = $db;

   }

}
现在,数据库中的每个方法都可以通过$this->DB访问数据库

这还解决了在将来需要B或C类时,为A或的每个实例打开多个数据库连接的问题


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

为什么不使用_构造函数?关于您的DB类,我想下面的阅读会对你有帮助:与其直接说这是一个非常糟糕的主意并投反对票,不如你就扩展不正确的原因提出建议,这样我们都可以学习。只是一个想法。另外,别忘了……OP是一种全新的OOP,使用诸如extends之类的可见性是学习的关键。@Kitson88数据库访问是一种非常特殊的情况。@Kitson88了解extend非常重要,我同意。但是对于任何类似的问题,您的默认工具都应该是组合的,并且只有在绝对有意义的情况下才能扩展。如果您想了解更多,请查看SOLID design并搜索术语composition over Inheritation。这应该是一个很好的谷歌关键词。@Kitson88你应该在这里问自己的真正问题是,DB的替代品。答案可能是否定的,A只需要能够使用DB中的功能。在这种情况下,使用extend总是一个坏主意。我认为我的答案中包含了正确的信息。至少我试过了。我可以看出,如果其中有些内容不熟悉,情况似乎并非如此。@Evert谢谢你的回答……但我想我还是遗漏了一些东西。在类A上,我有函数uu constructDb$db{$this->db=$db;},所以要运行一个查询,我应该使用…`返回$this->Db->select$query;`对的
Open connection to DB
Data Select Here!
Connection Closed
class A {

   protected $db;

   function __construct(DB $db) {

       $this->db = $db;

   }

}