PHP OO-如何初始化业务对象?
所谓业务模型或业务对象,我指的是像“用户”这样的普通旧对象及其所有属性名称、地址等。。。;除了所有用户属性之外,假设每个用户都有一个“AppointmentBook”对象,每个book都有一组“TimeSlot”对象,等等。 业务模型中的对象之间有引用,至少我是这样用Java编写业务模型的。 问题来了: 要初始化我的业务对象,在Java中,我需要PHP OO-如何初始化业务对象?,php,oop,architecture,business-objects,Php,Oop,Architecture,Business Objects,所谓业务模型或业务对象,我指的是像“用户”这样的普通旧对象及其所有属性名称、地址等。。。;除了所有用户属性之外,假设每个用户都有一个“AppointmentBook”对象,每个book都有一组“TimeSlot”对象,等等。 业务模型中的对象之间有引用,至少我是这样用Java编写业务模型的。 问题来了: 要初始化我的业务对象,在Java中,我需要 在应用程序运行期间,仅从数据库获取一次所有数据 初始化 将数据从我的数据库映射到我的业务对象 存储在内存(映射)中,它们将在所有请求中共享 PHP的无
更新:说我会在Java应用程序初始化期间将整个数据库加载到内存中有点愚蠢。我的意思是,如果我需要获取一个特定的用户,我可以加载它的所有数据,这些数据可以通过所有请求访问。在PHP中,您不会将域业务模型的所有数据都保存在内存中。相反,您只需要从DB请求所需的数据(如果需要,可以通过缓存) php中的模型层应该由多个域对象和数据映射器构建(我假设,这部分与Java并没有太大区别)。如果您需要
用户
详细信息,则只从数据库/缓存中获取该信息。您很可能会有一个单独的映射器来处理用户
显示有关该用户的信息,而忽略查询。下一个请求(何时和是否出现)将需要不同的信息。可能您需要为该用户提供联系人列表
。。。那么您真的不需要用户本身,只需要他的用户id
。同样,您可以让mapper将数据提取到负责处理联系人列表的域对象中,如果联系人列表包含User
实例,则只需创建它们,但保持“未提取”状态(对象只知道自己的用户id)。只有在你真正需要的时候才取,并且只取你将在“视图”中使用的部分
另外,您可能会注意到,我后来告诉过您,模型应该分段,但php开发人员通常只是为每个DB表(实现ActiveRecord)创建一个类,并将其称为“模型”。这是Ruby on Rails对php框架开发人员的影响造成的结果,这是过去5年来php遇到的最糟糕的事情之一。即使在Java中,您也不会将数据库中的所有数据加载到内存中。然而,在编写时,与PHP中通常使用的short相比,您可以加载更多的内容
然后,您应该“聪明”地只从持久性存储中加载执行请求操作所需的数据。这就要求对象足够“聪明”,能够延迟加载数据
例如,可以通过对自身有足够了解的和对存储有足够了解的来实现这一点
根据应用程序的类型,还有其他模式可能适合您的需要,但是域模型和数据映射器是非常灵活的
PHP世界中的一个典型数据映射器是。您的Java示例意味着您将整个数据库内容存储在内存中。如果你这么做了,数据库的意义何在?为什么不创建所有这些对象并将它们永久转储呢
如果我使用相同的逻辑,那么对于每个请求,我必须从数据库中获取所有对象
这简直是疯了,你不需要获取任何东西,你在需要时创建新实例,在不再需要时销毁它们
假设对于一个HTTP请求,我只需要用户属性,而不需要访问他的约会簿
这很简单,重新设计您的用户。您的用户需要它的属性和名为appointmentBook的属性,appointmentBook只是一个约会簿ID数组
如果您确实需要这些约会,您可以稍后从数据库中获取它们
这意味着我将从我的模型中用大量空值初始化PHP对象(空值是因为用户中包含的对象我不会加载),这可能会在以后导致错误
如果你的用户对象太大的话,那就不太可能了。如果将其缩小,则应加载整个用户。当然,用户必须足够小,以便您能够合理地加载它
如果您不想这样做,那么您可以创建一个UserProperties类,让每个用户都有一个。当您加载用户时,您将加载属性,但您也可以选择单独创建属性。在我看来,OP更熟悉桌面应用程序开发。。桌面开发者可以在内存中加载大量信息,并将其保存。