1

我刚刚开始一个具有产品类的新项目。一个对象将代表一个产品。

每个产品都有任意数量的未定义属性(可能是颜色,可能是 foobar 等)。产品对象将包含任一属性对象的数组:

class attr {
  var type;  // string, float, int etc..
  var name;  // the name
  var value; // the value
  ...

(and then the product object has an array of these attr objects..)

或者我应该为每个产品存储一个数组:

class product {
  var attributes = array('colour' => 'red', 'weight' => '11')
  ...

显然,如果需要,我可以将数组设为 2d 并存储属性类型。

我主要担心的是产品可能有 20 个左右的属性,并且我正在创建的网站有很多用户,这可能会占用大量内存 - 这是正确的,还是只是一个神话?

我只是想知道是否有人知道这种事情的最佳实践是什么。对象方法感觉更正确,但对我来说有点浪费。有什么建议/想法吗?

4

4 回答 4

2

作为一般建议,我反对早期优化,特别是如果这意味着将您的 OO 模型转换为隐式(非建模概念)事物,如数组。虽然我不知道您将使用它们的上下文是什么,但将属性作为一等公民将允许您在需要时将行为委托给它们,从而使 IMO 设计更加简洁。从我的角度来看,如果您需要操作属性、它们的类型等,您将主要受益于使用第一种方法。

话虽如此,有很多框架使用数组方法通过使用数组和_get()/_set()魔术方法来动态填充对象。例如,您可能想看看Elgg如何处理类的$attributes数组ElggEntity以查看它的工作情况并获得一些想法。

高温高压

于 2012-12-17T12:03:18.807 回答
2

AFAIK,没有最佳实践。

如您的问题中所述,您有两个选项,每个选项都有其 cos'n'pros。它所依赖的只是产品和属性的存储方式/位置 - 如果它在 MySQL 数据库中,则应该没有区别,因为您可以从数据库中获取数组或对象。

如果您对每件简单的事情都使用类,那么对属性也使用类,如果您只对大对象使用类,那么使用数组。这取决于您的喜好。使用类或数组时不会有任何显着的内存消耗差异,并且绝不会在拥有 20 个左右的属性时出现。

如果它在我身上,我会选择属性的类和类数组,因为如果我需要以某种方式扩展属性,它会在未来提供更多优势。

于 2012-12-17T11:55:08.857 回答
2

如果 Product 类确实需要灵活并容纳任意数量的属性,我会很想使用 __get 和 __set 例如

class Product {

    protected $attributes = array();

    public function __get($name) {

        if (array_key_exists($name, $this->attributes)) {
            return $this->attributes[$name];
        }
    }

    public function __set($name, $value) {

        $this->attributes[$name] = $value;
    }
}


$o = new Product();
$o->foo = 123;
var_dump($o->foo);

如果您的解决方案需要,这将非常适合在未来实现 ArrayAccess 和其他 SPL 迭代器类型类。

于 2012-12-17T12:09:34.880 回答
0

我认为考虑如何将它们存储在数据库中更为重要。我猜您想进行搜索,您可以在其中说出类似的内容,I want a RED HAT size 12然后您必须能够找到所有具有与此匹配的属性的产品。这都是在数据库级别上完成的。首先在 PHP 类中加载所有产品然后搜索不是一个好主意。

一旦你得到你想要显示的内容(搜索结果、概览页面、详细信息),然后你加载带有属性的完整产品类。由于它的所有文本/数字,一次可能不会超过 100 个产品,因此在速度方面,您在 PHP 中选择什么并不重要。做你最喜欢的事。

在您的数据库中,这可能很重要(因为您始终使用所有产品)。确保将字符串/数字/布尔值等分开并放置正确的索引,否则可能会导致性能下降。

于 2012-12-17T11:59:40.330 回答