【问题标题】:php object oriented programmingphp面向对象编程
【发布时间】:2011-07-09 06:31:13
【问题描述】:

我有一些关于 OOP 的问题。我不是高级用户,但我遇到了一些人以前可能遇到过的问题。

基本上我使用 MVC 来处理我的 php 项目。我试图让课堂尽可能独立。但我认为这是相当艰难的。例如:

我有一个类 Car 和 User。用户将汽车信息发布到网站上,可能是为了出售...

在 User 类中,我基本上有 getUser 来获取用户信息。

所以在 Car 类中,我可能有 setCar、getCar、saveCar。为了显示这些汽车,我可能有一个 displayCars()。在 displayCars() 中,我可以使用 getCar 来获取汽车列表。但我可能还需要使用 User::getUser 来获取提交这些汽车的用户的用户信息。所以在某种程度上,displayCars 依赖于 User::getUser。

那我该怎么办呢?

【问题讨论】:

  • 也许你有 getCars 也返回发布汽车的人的用户 ID。然后,您可以使用该用户 ID 并将其传递给您的 getUser 方法。
  • displayCars 不应该是 Car 类的一部分。它应该在一个单独的类中,专门用于显示汽车。这个独立的显示器可以显示任何实现 ICar 的类。这样,显示器就可以重复用于 ICar 的不同实现。将显示代码与业务逻辑(功能)分开。谷歌“编程接口而不是实现”
  • 嗨 StackOverflowNewbie,是的,getCars 有 userId,我用它传递给 User::getUser() 以获取 userInfo。但是这里的问题在于依赖于 User::getUser() 的 Car::displayCars()。我想减少耦合。 =)
  • 嗨 Spidy,我会考虑你的想法。我认为将显示功能分开会减少耦合。然而,这让我想到了另一个相关的问题。例如:我有一个 CarComments 类,它处理用户为这些汽车提交的 cmets。如果我调用 deleteCar(),它也应该调用 CarComment::deleteComments()。所以也有一些依赖。嗯 =)

标签: php oop ooad


【解决方案1】:

你需要的不仅仅是汽车和用户来模拟这个问题。从概念上讲,我至少有以下几点:

  • 每辆汽车都应该由一个 Car 对象表示
  • 用户输入填充 Car 对象属性的信息
  • Car 对象和提交该 Car 的用户都成为 CarDBItem 对象的属性
  • 然后将所有 CarDBItem 放入一个 CarDB 对象中,该对象管理任何用户输入的所有汽车

当然,这已经大大简化了——当您实际编写应用程序时,它会比这更多。但我认为从这些方面来看问题是一个很好的起点。

【讨论】:

  • 嗨 jrtayloriv,tks。这肯定看起来很重=)。我可能不得不重新编写大部分代码。但值得寻求创建更强大的应用程序。
【解决方案2】:

您的困惑部分来自于 OO 和 MVC 是完全不同的设计概念,实际上可能是矛盾的。我在工作中也面临同样的争论。

例如,OO 说只有类本身应该知道该类是如何工作的,而其他所有类都应该只与它的接口对话。 MVC 说您应该拥有几乎没有功能的哑数据(模型)对象,并使用单独的类来保存业务逻辑。

OO 说如果您需要两个类以相似的方式工作,让它们从基类继承通用功能,而 MVC 通常更喜欢在调用具有实际功能的其他类的类前面放置一个外观。

可以将两者结合起来,但不能在相同的位置或层级。您可以使用组合来构建作为其他模型超集的模型(数据对象),并且可以使用继承来创建类似的控制器,但必须小心操作。

基于 Web 的应用程序非常适合 MVC,正如其他人指出的那样,您可以使用已建立的框架来指导您。

【讨论】:

  • 嗨 dj_segfault,谢谢信息。是的,我也经历过太多次了。好吧,我想这场辩论会不时兴起=)
猜你喜欢
  • 2010-09-18
  • 2017-07-05
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多