PHP类DEF:个别存取/增变器或__set()与开关()?(PHP class def: Indi

2019-07-21 06:01发布

当定义一个PHP类,这是优选的/最佳做法? 是否有我俯瞰任何主要区别?

这似乎是它可以更干净,简洁,方便写一个__set()魔术方法,把一个switch()构建它的情况下为所有的私有成员,而我想允许进入。 它不会从类中自动地叫,但随后又都不愿setFoo()所以如果我想在内部使用的访问/突变,我必须显式调用方法无论哪种方式。

另一个区别是,在类外的代码,我随时可以访问成员以同样的方式作为瓦尔$obj->foo ,无论是公共的(直接)或私有的(使用__set()与使用许多不同的方法。

我想这主要是归结到一个审美的选择。 举例来说,如果我有一个购买地址数据,我不希望有16种或更多的只是姓,名,地址1,地址,城市,州等不同的存取方法每个运输和计费数据。

是否有我忽视任何主要区别? (可能在复杂的IDE拒绝自动完成的成员名称的类之外,因为它被标记为私?)我有相当多回答我自己原来的问题? 在此先感谢您的输入。

Answer 1:

去为每个单独的访问器,并且希望能够从外部访问的每一个成员。 我曾经尝试都发现这些理由使用存取:

  • 不管你用它来记录您的API(doxygen的/ PHPDoc的/ Zend的),生成的文档不会显示是通过神奇的功能访问的成员。
  • 您可以记录访问者。 你真的应该能够把这样一行文档中:“重要事项此功能连接到数据库,这将是很慢,如果你可以使用otherFunction()。”
  • 访问者的执行是任何人都容易看到。 我不想挖成200系魔法功能的详细检查,如果访问做任何事情,除了设置/获取的值(这就是为什么我们写存取毕竟)。
  • 你已经提到的IDE的自动完成。
  • 该__get()函数有一个明确定义的函数头,所以你将无法创建返回引用干将,例如(使用数组时,这是真正伟大的,即$numbers = &$object->getNumbers(); $numbers[] = 4; -如果没有参考,则需要再次调用的setter)


Answer 2:

我看到的最大的区别是PHPDoc的:

  • 使用__set ,你将不能够产生PHPDoc的每个访问
  • 正在使用的现代人PHPDoc的IDE,这也意味着,如果你使用魔法的方法(使用你不会得到类型提示,也没有代码完成@property可能会有所帮助,但是,在这一点上)。

Personnaly,我会定义存取自己去,即使这意味着写更多的代码:

  • 与PHPDoc的没问题
  • 你可以使用任何参数和返回你想要的类型
  • 您明确指出可以使用的方法
  • 更容易使用特定的代码为每个proerty,不具有一个很长的__set方法。

另外,我想从设置里面的类属性时使用这些访问方法:它意味着多一点的代码,是的 - 但它也意味着通过特定的代码去(如代码检查一些东西),它们包含。

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



文章来源: PHP class def: Individual accessors/mutators or __set() with switch()?