Php 如何创建一次写入属性?

Php 如何创建一次写入属性?,php,oop,design-patterns,Php,Oop,Design Patterns,我陷入了一个普遍的面向对象问题,找不到正确的方式来表达我的问题 我想创建一个类,给我一个对象,我可以写一次,将它持久化到存储,然后无法更改属性。(例如:发票信息-一旦写入存储器,它应该是不可变的)。并非所有信息都立即可用,在对象的生命周期中,信息会被添加 我想避免的是,在尝试写作时出现例外情况,因为这感觉就像你提供了一份你不打算遵守的合同 以下是我迄今为止考虑过的一些想法: 在构造函数中传递任何写入信息。如果数据已经存在,构造函数将引发异常 在继承树中创建多个类,每个类代表实体生命周期的某个阶段

我陷入了一个普遍的面向对象问题,找不到正确的方式来表达我的问题

我想创建一个类,给我一个对象,我可以写一次,将它持久化到存储,然后无法更改属性。(例如:发票信息-一旦写入存储器,它应该是不可变的)。并非所有信息都立即可用,在对象的生命周期中,信息会被添加

我想避免的是,在尝试写作时出现例外情况,因为这感觉就像你提供了一份你不打算遵守的合同

以下是我迄今为止考虑过的一些想法:

  • 在构造函数中传递任何写入信息。如果数据已经存在,构造函数将引发异常
  • 在继承树中创建多个类,每个类代表实体生命周期的某个阶段,并在需要时使用适当的设置器。为所有读取操作添加一个Collective接口
  • 默默地丢弃任何不适当的书写
  • 我的想法是: 1.使构造函数高度不稳定,通常是一个坏主意。 2.复杂性爆炸,无法完全解决问题(您可以在同一请求中连续调用setter两次) 3.简单,但和例外情况相同的问题;这对你的客户来说都是个大骗局


    (仅供参考:我目前正在PHP5中工作——尽管我怀疑这是一个一般性问题)

    有趣的问题。我想你最好的选择是#1,但我不确定我会在构造函数中这样做。这样,客户机代码就可以选择如何处理异常(抑制异常、处理异常、将异常传递给调用方等等)。如果您不喜欢异常,可以将写入移动到
    write()
    方法,如果写入成功,则返回
    true
    ,否则返回
    false

    您想详细说明一下吗?如果领域驱动设计能够解决这个难题,我还没有看到。DDD本身并没有回答任何问题,相反,它提供了另一种看待问题的方式。要知道,在任何与语言相关的思考中,你想要什么是任何应用程序成功的关键。无论如何,我不会选择这些选项中的任何一个。你确定一旦输入了发票,就永远不需要修改发票,比如如果有人犯了他们想纠正的数据输入错误?嗨,贾斯珀-是的,我非常肯定。发票数据通过Web服务导出到第三方系统,然后第三方系统可以处理这些数据。我们允许手动更正的唯一方法是通过管理员干预,这样我们就可以保证两个系统是同步的——这是一个明确的业务需求。那么你说的是最初的想法,设置者抛出异常可以吗?无论如何,它比构造函数好。write()方法听起来很有趣。。。并不是说我完全反对异常,只是在这种情况下,异常似乎相当严重——每次在这些对象上设置属性时都要注意异常可能会很快变得单调乏味,我可以想象。@kander:我假设使用此代码的人都知道这些代码只写一次,因此,抛出异常可能是一件好事,因为它让用户知道他们做了一些非常淘气的事情。另一种选择是在某处悄悄地记录第二次写入,但这会增加对日志系统的依赖性。但是,根据使用情况,最好让应用程序在堆栈跟踪的飞溅中爆炸,而不是静默地抑制一次性写入对象的不正确使用。