我知道这方面有很多问题,我已经做了很多阅读。我想在我的项目背景下问这个问题,看看您可能有什么建议。
我有一个相当大的 Web 应用程序,其中包含许多类,例如用户和文章(我认为它们是主要类)和较小的类,例如图像和评论。现在在一个页面上,比如说一篇文章,它可能包含许多图像和评论的实例。有道理吗?现在说一个文章页面,我调用一个返回文章对象数组的静态方法。
这就是背景,所以这里有问题。
由于构建了大量的应用程序,我开始意识到拥有一个包含设置和共享功能的核心系统类将非常有用。在那里,我用一个新的核心课程扩展了我的所有课程。似乎相对简单且快速实施。我知道 CodeIgniter 做了类似的事情。我现在感觉虽然我的应用程序变得有点混乱。
问题这是个好主意吗?创建核心实例正是我在调用文章实例时想要的,但是当我使用静态方法创建多个实例时,或者在页面上调用多个图像或评论时呢?我不必要地调用核心课程对吗?实际上它只需要每页调用一次(例如,构造函数从数据库中定义各种设置,我不想每次都这样做,显然每页只调用一次),但是所有类的所有实例都应该可以访问它核心班。听起来就像我想要单例方法一样,但我知道这在 PHP 中是浪费时间。
这是我的代码此时的样子。我尽量保持简单。
class core {
public function __construct(){
...define some settings which are retrieve from the database
}
public function usefulFunction(){
}
}
class user extends core {
public function __construct(){
parent::__construct();
}
public function getUser($user_id){
$db = new database();
$user = /* Get user in assoc array from db */
$this->__setAll($user);
}
public static function getUsers(){
$db = new database();
$users = /* Get users from database in assoc array from db */
foreach($users as $user) {
$arrUsers[] = new self();
$arrUsers[]->__setAll($user);
}
return $arrUsers;
}
private function __setAll($attributes) {
foreach($attributes as $key => $value)
{
$this->__set($key, $value);
}
}
public function __set($key, $value) {
$this->$key = $value;
}
}
我遇到的另一个问题是有效地使用/共享数据库连接。目前,需要数据库连接的类中的每个方法都会创建一个新的数据库实例,因此在一个页面上我可能会这样做 5 或 10 次。像依赖注入原理这样的东西听起来要好得多。
问题现在,如果我将数据库的实例传递给新的用户类,我知道我需要这样的东西......
class user{
protected $db;
public function __construct($db){
$this->db = $db;
}
... etc
}
$db = new database();
$user = new user($db);
...但是当我想运行静态函数 users::getUsers() 时,访问数据库实例的最佳方法是什么?我需要在每个静态方法中将它作为变量传递吗?(许多类中有许多静态方法)。这似乎不是最好的方法,但也许没有其他方法。
问题如果按照第 1 部分中的建议将我的所有类从核心类中扩展出来,我可以在那里创建一个数据库实例并以某种方式访问它吗?
问题我还有各种包含函数(不是 oop)的文件,它们就像帮助文件。这些访问数据库的最佳方式是什么?我再次在每个函数中创建了一个新实例。我真的不想将数据库作为参数传递给每个人。我应该使用全局变量,将这些帮助文件转换为类并使用依赖注入或其他不同的东西吗?
我知道那里有很多建议,但是大多数关于 PHP 的信息和教程都已经过时了,而且似乎从来没有涵盖过这么复杂的东西……如果你可以称之为复杂的话?
关于如何最好地布局我的班级结构的任何建议。我知道这看起来很多,但肯定这是大多数开发人员每天都面临的问题。如果您需要更多信息,请告诉我并感谢您的阅读!