我刚刚开始一个有产品类的新项目。对象将代表产品。
每个产品都有任意数量的未定义属性(可以是颜色,也可以是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个左右的属性,并且我正在创建的网站有很多用户,这可能会占用大量内存 - 是正确的,还是只是一个神话?
我只是想知道是否有人知道这种事情的最佳做法是什么......对象方法感觉更合适但对我来说感觉有点浪费。有什么建议/想法吗?
答案 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中选择什么。做你最喜欢的事。
在您的数据库中它可能很重要(因为您总是使用所有产品)。确保你分开字符串/数字/布尔等,并放置正确的索引,否则你可能会有市长表现下降。