【发布时间】:2011-06-01 07:43:40
【问题描述】:
我已经使用 PHP 进行了一段时间的开发,但直到最近才切换到 OOP 方法。
对我来说,一个不断出现的问题是 OOP 的东西“走多远”,特别是在执行速度和内存资源等方面。
例如,假设我有 2 个对象,用户和列表
列表始终链接到单个用户。 UserId 是 Listing 的一个属性,所以我知道它与哪个用户相关。 有时,在一个列表方法中,我需要访问相关用户的单个属性。
据我所知(如果没有,请告知)我有 3 个选项来完成此操作。
创建一个新的用户对象并通过 $user -> theProperty 访问相关属性
将所需属性设为列表的本地属性,并在初始化列表时填充此属性(例如,通过 sql 连接)
直接查询数据库,通过用户ID获取User所需的属性
在我看来,选项 1 和 2 更严格地遵守 OOP 规则,但由于初始化整个对象只是为了检索 1 个属性而导致性能下降。选项 3 占用的内存最少,但完全避开了 OOP。
此外,就在创建时填充对象而言,我的大多数对象在初始化后不久就通过一个“填充”方法填充了它们的大部分属性(因此只需要 1 个 DB 查询)。这通常被认为是最佳实践,还是更建议使用单独的方法来获取这些属性,并在需要时填充它们?
我知道对此可能没有“正确”的答案,但任何人都可以就处理这种情况的最佳方法提供建议吗?
非常感谢 尼克
【问题讨论】:
-
您可以一举 (1+2) 在用户登录后立即获取有关用户的所有信息(假设登录),填充它并将其存储为对象,然后保留它到处获取有关他们的信息,直到他们注销然后销毁该对象。我想这就是我尝试的方式。
-
除非您对这三种方法进行了剖析并发现其中一种会严重影响性能,否则您现在不应该担心内存消耗或处理速度。只使用有效的。
-
如何让 User 对象成为 Listing 对象的属性,而不仅仅是 UserId?
-
我会推荐方式 1,这样您就可以像(在列表方法中)
$this->getUser()->getProperty()一样访问它,但并不真正相关,但请查看 martinfowler.com/eaaCatalog/singleTableInheritance.html && martinfowler.com/eaaCatalog/concreteTableInheritance.html