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

Yuv*_*rmi 5 php oop class

我有一个includes.php页面,我在我的网站的每个页面的开头加载.在我开发网站时,我使用的课程数量正在增长.所以我最终得到这样的东西:

$db = new DB($config);
$login = new Login($db, $config);
$form = new Form($db, $config);
Run Code Online (Sandbox Code Playgroud)

这样的例子不胜枚举.关于这种做法,我有两个问题:

首先,考虑到我可能没有在某个页面上使用类(我可能在每个页面上都没有$表单),每次加载任何给定页面时加载此类,在性能方面确实有多重要?

其次,您可能已经注意到我将类实例$ db传递给所有其他类,以及变量$ config.在每个类的PHP代码中,我做这样的事情:

public $db;
public $config;

public function __construct($db, $config, $smarty){
    $this->db = $db;
    $this->config = $config;
}
Run Code Online (Sandbox Code Playgroud)

然后在类方法中,我使用'this'来解决数据库和配置文件:

public function myfunction(){
  $this->db;
  $this->config;
}
Run Code Online (Sandbox Code Playgroud)

我应该何时使用'extends'而不是将$ db传递给类,假设每个类都使用db?在性能方面,以每个类别传递$ db是否会受到任何影响?

谢谢!

Pas*_*TIN 7

我应该何时使用'extends'而不是将$ db传递给类,假设每个类都使用db?

什么时候有意义 - 只有当它有意义时!

您至少需要考虑两件事:

  • " class A extends B"有点意思" class A **is a** B"
    • 更清楚的Car是,a 是一个MotorVehicule; a MotorVehicule是a Vehicule; a Bus是a MotorVehicule; 自行车是一个Vehicule
    • 但是,a Ball不是Vehicule
    • 在你的情况下,一个Form绝对不是一个DataBase!也不是Login
  • 在PHP中,一个类只能有extend 一个
    • 你不能同时拥有一个Vehicule和一个Animal
    • 但是a Car 是a MotorVehicule,它本身就是 Vehicule :-)

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

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


$db您可以使用, 而不是传递给每个构造函数

  • 无论是单件设计图案
  • 或者注册表设计模式
  • 或某种全局变量,但这几乎是相同的...只是更糟(不是OOP和所有这些)!

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


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

  • 如果可以,请使用自动加载
  • 如果可以的话,使用像APC这样的操作码缓存

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


最后一件事 :

在性能方面,以每个类别传递$ db是否会受到任何影响?

也许它确实有点位; 但是,真的,除非你是谷歌并拥有数百万用户......谁在乎呢?

如果您正在进行几个数据库查询,那么与将一个参数传递给十几个方法相比,这将花费大量时间!
因此,通过参数的少量时间可能会被忽略:-)