我有一个includes.php页面,我在网站每个页面的开头加载。 在我开发网站时,我使用的课程数量正在增长。 所以我最终得到这样的东西:
$db = new DB($config);
$login = new Login($db, $config);
$form = new Form($db, $config);
这个清单一直在继续。 关于这种做法,我有两个问题:
首先,考虑到我可能没有在某个页面上使用某个类(我可能在每个页面上都没有$表单),每次给定时加载此类,在性能方面确实有多重要页面已加载?
其次,您可能已经注意到我将类实例$ db传递给所有其他类,以及变量$ config。在每个类的PHP代码中,我做这样的事情:
public $db;
public $config;
public function __construct($db, $config, $smarty){
$this->db = $db;
$this->config = $config;
}
然后在类方法中,我使用'this'来解决数据库和配置文件:
public function myfunction(){
$this->db;
$this->config;
}
我应该何时使用'extends'而不是将$ db传递给类,假设每个类都使用db?将$ db传递给每个类在性能方面是否有任何影响?
谢谢!
答案 0 :(得分:7)
我什么时候应该使用'extends' 比通过$ db到班级, 假设每个类都使用db?
什么时候有意义 - 只有在它有效的时候!
您至少需要考虑两件事:
class A extends B
”表示“class A **is a** B
”
Car
是MotorVehicule
; MotorVehicule
是Vehicule
; Bus
是MotorVehicule
;自行车是Vehicule
Ball
不是Vehicule
Form
绝对不是DataBase
!也不是Login
extend
一个类
Vehicule
和Animal
Car
是 MotorVehicule
,其本身是 Vehicule
: - )< /强> 对于Database对象(在您的情况下,它更多是与DB的连接),您的大多数类本身不会“成为”数据库连接。所以,他们不应该扩展那个类。
但是,他们正在使用数据库连接(Form
“有”数据库连接);所以,他们应该有一个表示该数据库连接的属性。这就是你在做什么。
您可以使用
$db
传递给每个构造函数
但是传递$db
对象非常适合单元测试,模拟对象以及所有......
我认为它可以被认为是依赖注入设计模式,btw (不确定,但看起来像)
关于加载很多课程,其他人给出了答案:
这两个都是很好的建议,你应该考虑; - )
最后一件事:
将$ db传递给每个班级都会受到伤害 以任何方式表现?
也许是小位;但是,诚然,除非你是谷歌并拥有数百万用户......谁在乎呢?
如果您正在进行几个数据库查询,那么与将一个或多个参数传递给十几个方法相比,这将花费大量时间!
因此,通过参数的少量时间可能会被忽略: - )
答案 1 :(得分:4)
你尝试过这样的事吗?
function __autoload($class_name) {
require_once("includes/php/class." . $class_name . ".php");
}
所以它只在遇到类名时才加载类名。 (更改路径以适合您的php类...我的类似于class.Object.php,类名为“Object”)。
答案 2 :(得分:1)
为什么不仅包含需要包含的文件?此外,尝试仅在需要的地方实例化您需要的对象。实际上,您的includes.php
正在进行大量实例化,而您可能并不需要这些实例。
如果$db
作为参考传递,则不应影响性能。 (我对PHP5知之甚少,但是对于PHP4,有一个带有'&
'修饰符的引用概念。)
答案 3 :(得分:1)
如果加载和解析脚本文件成为瓶颈,您可以使用像apc这样的字节码缓存来加速生命周期的这一部分。
答案 4 :(得分:1)
我不确定你在这里究竟想要使用继承('extends
')。您可以使用它来定义两个字段$db
和$config
,但不会有太大变化。
此外,当您确实想要从其他类继承有用的东西时,它可能会限制您。
根据您的设计,您可能需要考虑将$config
设为全局。是否存在同时激活超过1个配置的情况?然而,引入全局$db
变量可能不是一个好主意。例如,可以想象您可能需要多个数据库连接。