【问题标题】:Best way to get Properties when they are not public / PHP不公开/ PHP 时获取属性的最佳方式
【发布时间】:2014-06-21 10:35:25
【问题描述】:

我有一个类,当我实例化它时,它会通过构造填充属性。 此类的目标是描述一家商店,因此他的属性将受到保护,因为它们仅属于该类。

但问题是有时我需要从属性中获取有关该类的一些信息。

示例:

class Shop {

  protected $name;

  protected $typology;

  protected $owners;

  protected $closed;

  public function __construct($name,$typology,$owners,$closed)
  {
       $this->name = $name;
       $this->typology = $typology;
       $this->owners = $owners;
       $this->close = $closed;
  }

}

$shop = new Shop("Name Shop","vegetarian",2,1);

$superMarket = SupermarketFactory::getInstance($shop);

Supermaket 类上(通过工厂实例化),需要获取商店属性才能使用。

有很多方法可以完成这项工作,但在我看来,所有解决方案都有些混乱。我尝试了这种方式:

  • 设置 getter 和 setter - 要排除这种方式,拥有 20 个属性,我需要 40 个方法。脚本效率不高。

  • 使用 __get() 魔术方法,我的 IDE 抱怨通过魔术方法获取这些属性。这甚至是真的,因为此时我可以将其设为公开。

  • 使用反射,似乎是上述方法中最好的,但仍然需要太多的实现才能只获取属性(我猜)

所以我想实现最好的设计来完成这项工作,拥有一个具有受保护属性但同时可以以优雅方式调用的类。

是否有任何设计模式有助于实现这一目标?

我可能已经在 stackOverflow 上问过类似的问题,但我审查了这个问题并以更好的方式提出了建议。

【问题讨论】:

    标签: php properties


    【解决方案1】:

    您可以在类文档块中使用@property 标记定义可通过__get()__set() 访问的属性列表,这应该使它们对IDE 可见

    请参阅 http://www.phpdoc.org/docs/latest/for-users/phpdoc/tags/property.htmlhttp://manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/tutorial_tags.property.pkg.html 以获取参考和示例

    【讨论】:

    • 感谢它的工作,所以你认为最好的方法是使用 __get() 魔术方法保留这个类?
    • 我也不认为拥有单独的 getter 和 setter 有任何问题;但是,如果您有 20 个带有 getter 和 setter 的属性,那么您可能已经到了需要稍微分解类的地步……除了 ORM 和类似的具有依赖于数量的数据库结构的属性数据库表中的列(并且无论如何都倾向于使用 __get() 和 __set(),通常你不应该在任何一个类中拥有那么多属性
    • 好的,谢谢你的回答很有帮助,但我想保持这个问题的开放性,无论如何,阅读这篇文章developers.google.com/speed/articles/optimizing-php它让我远离使用getter和setter
    • 使用所有魔术方法(如 __get()、__set()、__isset() 等)都会产生开销,但除非您在自己的情况下实际测量它是一个问题,否则不要避免仅基于对性能的担忧而适合使用它们的魔术方法....在适当的地方使用它们,并且仅在您看到会出现速度问题时才更改(即,当您在每个请求中使用它们数千次时) )。对于大多数应用程序来说,你的代码比一些神奇的方法调用要慢得多
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多