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

Mat*_*hew 6 php architecture oop business-objects

根据商业模式或业务对象,我指的是像"用户"这样的普通旧对象,其所有属性名称,地址,......; 除了所有用户属性之外,假设每个用户都有一个"AppointmentBook"对象,每本书都有一组"TimeSlot"对象等.商业模型中有对象,它们之间有引用,至少我是如何对业务进行编码的Java中的模型.问题出在这里:

要用Java初始化我的业务对象,我会的

  1. 在应用程序初始化期间,仅从DB获取一次所有数据,
  2. 将数据从我的数据库映射到我的业务对象
  3. 存储在内存(地图)中,它们将在所有请求中共享.

PHP Share-Nothing-Architecture让我对正确的OO编程感到困惑:如果我使用相同的逻辑,我将不得不从DB中获取所有对象,因为每个请求(我知道我仍然可以缓存,但是你没有缓存所有数据库,这不是关于缓存的问题,而是关于PHP及其架构中的编程方式).

所以,假设对于一个HTTP请求,我只需要用户属性,而不需要访问他的约会簿.从User获取的所有对象中获取DB的所有数据将是一个小问题,因为我只需要他的属性.这意味着我将使用很多NULL值从我的模型初始化PHP对象(因为我将不加载的User中包含的对象为NULL),这可能导致错误.

我想知道专业的PHP开发人员通常如何使用他们的业务对象?(我来自Java)


更新:说在Java中的应用程序初始化期间我将整个数据库加载到内存中是一种愚蠢的做法.我的意思是,如果我需要获取特定用户,我可以加载其所有数据,并且可以通过所有请求访问.

ter*_*ško 2

在 PHP 中,您不会将域业务模型的所有数据都保存在内存中。相反,您只从数据库请求(如果需要,通过缓存)您想要的数据。

php 中的模型层应该由多个域对象和数据映射器构建(我认为这部分与 Java 没有太大不同)。如果您需要User详细信息,那么您只需从数据库/缓存中获取该信息。您很可能会有一个单独的映射器仅用于处理用户。

您显示有关该用户的信息,并忘记查询。下一个请求(何时以及如果到来)将需要不同的信息。也许你会想要ContactList这样User......那么你真的不需要用户本身,只需要他的user_id。再次,您让映射器将数据获取到负责处理联系人列表的域对象中,如果联系人列表包含User实例,则只需创建它们,但保持“未获取”状态(对象只知道自己的 user_id)。仅当您确实需要时才获取它们,并且仅获取您将在该“视图”中使用的部分。


PS你可能注意到了,我告诉过模型稍后应该被分段,但通常php开发人员只是为每个数据库表(实现ActiveRecord)创建单个类并将其称为“模型”。这是 Ruby on Rails 对 php 框架开发人员影响造成的结果,恕我直言,这是过去 5 年来 PHP 发生的最糟糕的事情之一。