Php 如何在其他类中调用一个类?
我是OOP新手,我有一个简短的问题: 我的代码中包含以下类: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的方法。由于您
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;
}
}