加载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

我有一个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){
    $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连接(一个
表单
有一个”DB连接);因此,它们应该具有表示该DB连接的属性。这就是你正在做的


您可以使用

  • 或者是设计模式
  • 或者注册表设计模式
  • 或者某种全局变量,但这几乎是一样的。。。只是变得更糟(不是OOP之类的)
但是传递
$db
对象对于单元测试、模拟对象以及所有这些都非常有用。。。
我认为它可以被认为是依赖注入设计模式,顺便说一句(不确定,但看起来像)


关于加载大量课程,其他人给出了答案:

  • 如果可以,请使用自动加载
  • 如果可以的话,使用操作码缓存,比如APC
这两个都是你应该考虑的好建议


最后一件事:

将$db传递给每个类是否会造成伤害 在任何方面的表现

也许它做了一点点;但是,老实说,除非你是谷歌,拥有数百万用户。。。谁在乎呢

如果您要执行几个DB查询,那么与向十几个方法传递一个或多个参数相比,这些查询将花费大量时间!

因此,通过参数所用的少量时间可能可以忽略不计。:-)

我一直想知道,在PHP中,符号和(&)是做什么的?符号和给你一个变量的引用。在PHP5中,您不应该将此用作提高性能的方法(PHP在编写时进行复制)。此外,在PHP5中,对象变量已经是对对象的引用,因此除非使用“克隆”,否则不会复制对象。此外,jeyoung还说:您真的应该只在需要时加载所需的对象。在这篇文章中仍然有一些未回答的问题(何时使用扩展),这些问题可以更好地提取到新的SO问题中。我是将这些代码放在我的includes文件中,还是放在我的类中?它不会总是遇到t吗