PHP,存储属性..数组中的对象或值

时间:2012-12-17 11:46:46

标签: php oop

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

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

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 个答案:

答案 0 :(得分:2)

没有最佳实践,AFAIK。

您有两个选项,如您的问题所述,其中每个都有其cos'n'pros。它取决于产品和属性的存储方式/位置 - 如果它在MySQL数据库中仍然存在差异,因为您可以从数据库中获取数组或对象。

如果您正在为每个简单的事物使用类,那么也使用类作为属性,如果您只使用类来处理大对象,则使用数组。根据您的喜好。使用类或数组时不会有任何明显的内存消耗差异,绝不会有20个左右的属性。

如果它出现在我身上,我将使用类和类数组来获取属性,因为如果我需要以某种方式扩展属性,它将来会带来更多优势。

答案 1 :(得分:2)

作为一般建议我反对早期优化,特别是如果这意味着将你的OO模型变成隐式(非模型概念)之类的东西,比如数组。虽然我不知道你将使用它们的上下文是什么,但是如果你需要的话,拥有作为一等公民的属性将允许你将行为委托给他们,从而导致更清洁的设计IMO。从我的观点来看,如果你需要操纵属性,它们的类型等,你将主要受益于使用第一种方法。

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

HTH

答案 2 :(得分: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迭代器类型。

答案 3 :(得分:0)

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

获得要显示的内容(搜索结果,概述页面,详细信息)后,您将加载包含属性的完整产品类。由于它的所有文本/数字,可能不会超过100个产品,速度明智,它不会影响你在PHP中选择什么。做你最喜欢的事。

在您的数据库中它可能很重要(因为您总是使用所有产品)。确保你分开字符串/数字/布尔等,并放置正确的索引,否则你可能会有市长表现下降。