PHP类def:单独的访问器/ mutator或带有switch()的__set()?

Wis*_*guy 8 php oop coding-style

在定义PHP类时,哪个是首选/最佳实践?我有什么关键差异吗?

看起来它可以更干净,简洁,更方便地编写一个__set()魔术方法,并switch()在其中放置一个构造,其中包含我想要允许访问的所有私有成员的案例.它不会从类内部自动调用,但是也不会再调用setFoo(),所以如果我想在内部使用accessor/mutator,我必须以任何方式显式调用方法.

另一个区别是,在类外部的代码中,我总是可以以与$obj->foo公共(直接)或私有(使用__set())相同的方式访问成员变量,而不是使用许多单独的方法.

我想这主要归结为审美选择.例如,如果我有购买的地址数据,我不希望有16个或更多单独的访问者方法,仅用于名字,姓氏,地址1,地址2,城市,州等,每个用于运送和账单数据.

我忽略了哪些关键差异?(一个复杂的IDE可能拒绝在课外自动完成一个成员名称,因为它被标记为私有?)我几乎回答了我自己的原始问题吗?提前感谢您的意见.

sou*_*rge 7

与您希望从外部访问的每个成员一起使用各个访问者.我试过两个并发现这些原因使用访问器:

  • 无论您使用什么来记录您的API(doxygen/PHPdoc/Zend),生成的文档都不会显示可通过魔术函数访问的成员.
  • 您可以记录访问者.你真的应该能够在文档中添加这样的行:" 重要!这个函数连接到数据库,它会非常慢,如果可以,请使用otherFunction()."
  • 任何人都可以轻松看到访问者的实现.我不想深入研究200行魔术函数的细节,以检查访问者除了设置/获取值之外是否做了什么(这就是为什么我们最终会编写访问器的原因.)
  • 您已经提到过IDE的自动完成功能.
  • __get()函数有一个定义良好的函数头,因此你将无法创建返回引用的getter(例如,在使用数组时这真的很棒,即$numbers = &$object->getNumbers(); $numbers[] = 4;- 没有引用,你需要再次打电话给安装员.)

  • "与每个想要从外面访问的成员一起使用各个访问者",不,不!抽象失败.与您希望从外部访问的对象的每个_semantic property_一起使用各个访问器.在您的特定用例中,这些概念之间可能存在一对一的关联,或者可能没有.一个例子是`getX,getY,getZ` vs`getDimensions`. (2认同)

Pas*_*TIN 5

我看到的最大区别是 phpdoc :

  • 使用__set,您将无法为每个访问器生成 phpdoc
  • phpdoc 被现代 IDE 使用,这也意味着如果您使用魔术方法,您将不会获得类型提示或代码完成@property尽管在这一点上使用可能会有所帮助)

Personnaly,我会自己定义访问器,即使这意味着要编写更多代码:

  • phpdoc 没问题
  • 你可以使用任何你想要的参数和返回类型
  • 您明确指出可以使用哪些方法
  • 更容易为每个属性使用特定的代码,而没有很长的__set方法。

此外,我会在从类内部设置属性时使用这些访问器方法:这意味着更多的代码,是的 - 但它也意味着通过它们包含的特定代码(例如检查某些内容的代码)。

最后,如果你只是使用一些属性来存储数据,并且不需要定义任何特定的行为,为什么不将它们公开,并允许用户直接访问它们呢?