加载php类的性能和'extends'的使用

时间:2009-07-31 16:56:02

标签: php oop class

我有一个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传递给每个类在性能方面是否有任何影响?

谢谢!

5 个答案:

答案 0 :(得分:7)

  

我什么时候应该使用'extends'   比通过$ db到班级,   假设每个类都使用db?

什么时候有意义 - 只有在它有效的时候!

您至少需要考虑两件事:

  • class A extends B”表示“class A **is a** B
    • 更清楚地说,CarMotorVehicule; MotorVehiculeVehicule; BusMotorVehicule;自行车是Vehicule
    • 但是,Ball不是Vehicule
    • 在您的情况下,Form绝对不是DataBase!也不是Login
  • 在PHP中,一个类只能extend 一个
    • 您不能同时拥有VehiculeAnimal
    • 但是Car MotorVehicule,其本身 Vehicule : - )< /强>

对于Database对象(在您的情况下,它更多是与DB的连接),您的大多数类本身不会“成为”数据库连接。所以,他们不应该扩展那个类。

但是,他们正在使用数据库连接Form”数据库连接);所以,他们应该有一个表示该数据库连接的属性。这就是你在做什么。


您可以使用

,而不是将$db传递给每个构造函数
  • Singleton设计模式
  • 或注册表设计模式
  • 或某种全局变量,但这几乎相同......只是更糟糕(不是OOP和所有这些)

但是传递$db对象非常适合单元测试,模拟对象以及所有......
我认为它可以被认为是依赖注入设计模式,btw (不确定,但看起来像)


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

  • 如果可以
  • ,请使用自动加载功能
  • 使用操作码缓存,如APC,如果可以

这两个都是很好的建议,你应该考虑; - )


最后一件事:

  

将$ 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变量可能不是一个好主意。例如,可以想象您可能需要多个数据库连接。