【发布时间】:2021-05-16 13:59:24
【问题描述】:
目前正在尝试学习使用 OOP 和 MVC 模型构建网站的“正确”方法,但由于多年来我主要从事程序性工作,因此显然遇到了一些绊脚石。
(我也是第一次使用 PHP 7,因为我多年来一直坚持使用 PHP 5,所以也尝试使用 mysqli_ 而不是旧的 mysql_ 编写“正确”的方式。学习准备好的语句第一次也不仅仅是逃避我所有的变量,但这是一个完全不同的讨论)
现在我有几个不同的课程:
config.class.php -> Config -> 设置数据库连接和其他站点设置
leads.class.php -> Leads 扩展 Config -> 根据请求(当有人访问网站时)从数据库获取潜在客户信息
questions.class.php -> Questions 扩展 Config -> 获取问题信息(这是一个调查网站)
leadsview.class.php -> - > LeadsView 扩展 Leads -> 如果需要,显示潜在客户信息
questionsview.class.php -> QuestionsView extends Questions -> 从数据库中提取问题信息后在页面上显示问题信息
所以,假设在我的 index.php 上,我需要同时实例化 QuestionsView 和 LeadsView,以便我可以分别在页面上显示问题和潜在客户信息。所以我这样做:
session_start();
include_once 'lib/autoload.php'; // class autoloader
$l = new LeadsView();
$q = new QuestionsView();
到目前为止一切正常。但是 - 在我的 Config 类中,我不仅有一个数据库连接,还有一个构造函数中的一些站点配置设置,当有人第一次点击页面时需要设置这些设置。到目前为止是这样的:
class Config {
// set up db connection
private $db_host;
private $db_user;
private $db_password;
private $db_name;
protected $conn;
protected $flow_id;
protected $domain;
public function __construct() {
$this->flow_id = $_REQUEST['flow'];
$this->domain = $_SERVER['HTTP_HOST'];
$this->connect(); // open the db connection
print "hey<br>";
}
protected function connect($db = "default") {
switch ($db) {
// allow for different db connections in the future
case "default":
$this->db_host = "XXXX";
$this->db_user = "XXXX";
$this->db_password = "XXXX";
$this->db_name = "XXXX";
break;
}
$this->conn = new mysqli($this->db_host, $this->db_user, $this->db_password, $this->db_name);
$this->conn->set_charset("utf8mb4");
if ($this->conn->connect_error) {
die("Error connecting to db: " . $this->conn->connect_error);
}
}
}
我输入了print "hey<br>"; 只是为了确保构造函数正在运行。但现在它运行了两次:一次来自我的$l = new LeadsView();,一次来自$q = new QuestionsView();,因为它们都扩展了 Config。出于显而易见的原因,我不需要或不想运行该构造函数两次。
所以我的问题是:在这样的场景中设置配置类的正确方法是什么?我是否应该创建一个与 Config 分开的 Dbh 类,并且只让我所有的问题、线索等类扩展 Dbh,这样它们就不会全部运行 Config 方法?还有其他一些我完全想念的明显方法吗?
【问题讨论】:
-
友情提示:不要在mysqli上浪费时间,直接转向PDO。从这里开始phpdelusions.net/pdo & websitebeaver.com/…
-
你没有正确使用mysqli。除非您要添加更多抽象,否则您创建的类是无用的。您还必须为 mysqli 启用错误报告。见How to get the error message in MySQLi?
-
您需要加载一次配置。实现这一点的最佳方法可能是使用singleton pattern。如果您想/需要发明一个框架,那么您应该看看流行的曾经以及它们是如何做到的。 I would rather suggest you to use a framework which people already invested a lot of time into, if you don't need to create a framework. 因为无论你做什么都是朝着那个方向发展的。
标签: php class oop constructor