PHP OO-如何初始化业务对象?

PHP OO-如何初始化业务对象?,php,oop,architecture,business-objects,Php,Oop,Architecture,Business Objects,所谓业务模型或业务对象,我指的是像“用户”这样的普通旧对象及其所有属性名称、地址等。。。;除了所有用户属性之外,假设每个用户都有一个“AppointmentBook”对象,每个book都有一组“TimeSlot”对象,等等。 业务模型中的对象之间有引用,至少我是这样用Java编写业务模型的。 问题来了: 要初始化我的业务对象,在Java中,我需要 在应用程序运行期间,仅从数据库获取一次所有数据 初始化 将数据从我的数据库映射到我的业务对象 存储在内存(映射)中,它们将在所有请求中共享 PHP的无

所谓业务模型或业务对象,我指的是像“用户”这样的普通旧对象及其所有属性名称、地址等。。。;除了所有用户属性之外,假设每个用户都有一个“AppointmentBook”对象,每个book都有一组“TimeSlot”对象,等等。 业务模型中的对象之间有引用,至少我是这样用Java编写业务模型的。 问题来了:

要初始化我的业务对象,在Java中,我需要

  • 在应用程序运行期间,仅从数据库获取一次所有数据 初始化
  • 将数据从我的数据库映射到我的业务对象
  • 存储在内存(映射)中,它们将在所有请求中共享
  • PHP无共享架构让我对正确的OO编程感到困惑: 如果我使用相同的逻辑,我将不得不为每个请求从数据库中获取所有对象(我知道我仍然可以缓存,但您不会缓存所有数据库,这不是缓存的问题,而是PHP编程方式及其体系结构的问题)

    假设对于一个HTTP请求,我只需要用户属性,而不需要访问他的约会簿。从数据库中获取用户引用的所有对象的所有数据将是一件麻烦事,因为我只需要他的属性。这意味着我将从我的模型中用大量空值初始化PHP对象(空值是因为用户中包含的对象我不会加载),这可能会在以后导致错误

    我想知道专业的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更熟悉桌面应用程序开发。。桌面开发者可以在内存中加载大量信息,并将其保存。