快捷类会影响性能


Shortcutting classes affect performance?

做同样事情的两段代码:

class Dog
{
   public $name;
   public $breed;
}
$hachi = new Dog;
$hachi->name = "Hachi";
$hachi->breed = "Shiba";

$hachi->name = "Hachi";
$hachi->breed = "Shiba";

在这个上下文中(使用类作为结构体),两个代码将实现相同的事情。除了可读性/风格之外,使用冗长的版本还有什么好处吗?是否存在性能问题或其他应该阻止我抄近路的问题?

实际上是的,即使除了明显的可维护性问题之外,还有另一个好处。使用预先声明的属性,PHP每个类只需要一个散列表,它将属性名称映射到用于每个对象的内存高效C数组中的偏移量。使用动态属性PHP需要每个对象一个哈希表。

因此,只要你有多个该类型的对象,你就在节省内存。


多少?让我们假设你有一大堆狗。

"冗长"版本:

class Dog
{
    public $name;
    public $breed;
}
while (@$i++ < 1000000) {
    $hachi = new Dog();
    $hachi->name = "Hachi";
    $hachi->breed = "Shiba";
    $dogs[] = $hachi;
}
echo memory_get_usage(true); //188747776

"捷径"版本:

while (@$i++ < 1000000) {
    $hachi = new stdClass();
    $hachi->name = "Hachi";
    $hachi->breed = "Shiba";
    $dogs[] = $hachi;
}
echo memory_get_usage(true); //524292096

对于524292096 - 188747776 = 335,544,320字节的差异


关于更长的解释,请参见:为什么在PHP中对象(通常)比数组使用更少的内存

类是用来帮助组织数据的,这肯定会增加开销。

如果你试图编写代码来很好地表示你将要处理的数据,你将不得不接受一些性能损失。

第二种方法将创建几乎不可能维护的代码。

PHP为我们提供了一种非常简单的方式来编程地定义对象,这就叫做类。类是定义和的包装器封装对象及其所有方法和属性。您可以将类看作是对象的可编程表示对象,它是PHP给开发者的接口,与对象交互或修改对象。此外,一个类可能是如果需要,可以无限地重用,使其非常强大和代码库友好。你不必每次都重新定义你想要的东西使用对象——设置一个正确编码的类来完成所有的工作给你。

从:http://www.htmlgoodies.com/beyond/php/object-orientated-programming-in-php-class-1-principles.html

如果两个代码都有效,那么选择短代码,将其添加到类中不会使其更快或更有效,这是一个很好的实践,并且可以帮助您添加大量代码来生成它。但是在性能方面,第二个会更好