加载php类的性能和使用';扩展';
我有一个includes.php页面,我在我的网站的每一页的开头加载它。 随着我开发网站,我使用的课程数量也在增长。 所以我的结局是这样的:加载php类的性能和使用';扩展';,php,oop,class,Php,Oop,Class,我有一个includes.php页面,我在我的网站的每一页的开头加载它。 随着我开发网站,我使用的课程数量也在增长。 所以我的结局是这样的: $db = new DB($config); $login = new Login($db, $config); $form = new Form($db, $config); public $db; public $config; public function __construct($db, $config, $smarty){ $thi
$db = new DB($config);
$login = new Login($db, $config);
$form = new Form($db, $config);
public $db;
public $config;
public function __construct($db, $config, $smarty){
$this->db = $db;
$this->config = $config;
}
清单上还有很多。
关于这种做法,我有两个问题:
首先,考虑到我可能没有在某个页面上使用类(我可能没有在每个页面上都使用$form),从性能角度来看,每次加载任何给定页面时加载此类到底有多重要
其次,您可能已经注意到,我正在将类实例$db以及变量$config传递给所有其他类。在每个类的php代码中,我都会执行以下操作:
$db = new DB($config);
$login = new Login($db, $config);
$form = new Form($db, $config);
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传递给每个类会对性能造成任何影响吗
谢谢 你试过这样的东西吗
function __autoload($class_name) {
require_once("includes/php/class." . $class_name . ".php");
}
因此,它仅在遇到类名时加载类名。
(更改路径以适合您的php类…我的类类似于class.Object.php,类名为“Object”)。为什么不只包含需要包含的文件?另外,尝试在需要的地方仅实例化那些您需要的对象。实际上,您的
includes.php
正在进行大量的实例化,您可能不需要一直这样做
如果将
$db
作为引用传递,则不会影响性能。(我对PHP5了解不多,但对于PHP4,有一个使用“&
”修饰符的引用概念。)如果加载和解析脚本文件成为瓶颈,您可以使用字节码缓存来加速这部分生命周期。我不确定您到底希望如何使用继承(“扩展
”)在这里您可以使用它来定义两个字段$db
和$config
,否则它不会有太大变化
此外,当您确实希望从另一个类继承有用的内容时,它可能会限制您
根据您的设计,您可能需要考虑制作<代码> $CONFIG Global。是否存在同时有多个配置处于活动状态的情况?然而,引入一个全局
$db
变量可能不是一个好主意。例如,您可能同时需要多个数据库连接
我应该在什么时候使用“extends”而不是
而不是将$db传递给类,
假设每个类都使用数据库
当它有意义的时候——而且只有当它有意义的时候
你至少要考虑两件事:
- “
”某种意思“A类扩展了B
”A类**是A**B
- 更清楚地说,
是汽车
;机动车辆
是机动车辆
;车辆
是公共汽车
;自行车是一种交通工具机动车辆
- 但是,
不是球
车辆
- 在您的情况下,
肯定不是表单
!也不是数据库
登录
- 更清楚地说,
- 在PHP中,一个类只能扩展一个类
- 您不能同时拥有
和车辆
动物
- 但是
汽车
是一辆
,它本身就是一辆机动车辆
:-)车辆
- 您不能同时拥有
表单
“有一个”DB连接);因此,它们应该具有表示该DB连接的属性。这就是你正在做的
您可以使用
- 或者是设计模式
- 或者注册表设计模式
- 或者某种全局变量,但这几乎是一样的。。。只是变得更糟(不是OOP之类的)李>
$db
对象对于单元测试、模拟对象以及所有这些都非常有用。。。
我认为它可以被认为是依赖注入设计模式,顺便说一句(不确定,但看起来像)
关于加载大量课程,其他人给出了答案:
- 如果可以,请使用自动加载
- 如果可以的话,使用操作码缓存,比如APC
最后一件事: 将$db传递给每个类是否会造成伤害 在任何方面的表现 也许它做了一点点;但是,老实说,除非你是谷歌,拥有数百万用户。。。谁在乎呢 如果您要执行几个DB查询,那么与向十几个方法传递一个或多个参数相比,这些查询将花费大量时间!
因此,通过参数所用的少量时间可能可以忽略不计。:-)我一直想知道,在PHP中,符号和(&)是做什么的?符号和给你一个变量的引用。在PHP5中,您不应该将此用作提高性能的方法(PHP在编写时进行复制)。此外,在PHP5中,对象变量已经是对对象的引用,因此除非使用“克隆”,否则不会复制对象。此外,jeyoung还说:您真的应该只在需要时加载所需的对象。在这篇文章中仍然有一些未回答的问题(何时使用扩展),这些问题可以更好地提取到新的SO问题中。我是将这些代码放在我的includes文件中,还是放在我的类中?它不会总是遇到t吗