【问题标题】:Is it correct using __call() instead of getters and setters?使用 __call() 而不是 getter 和 setter 是否正确?
【发布时间】:2014-10-08 10:30:06
【问题描述】:

关于良好实践的主题,对需要 getter 和 setter 属性的类使用 __call() 是否正确?

看一个 Doctrine Entity 的例子: https://gist.github.com/devmatheus/10668172#file-sessao1-php

我知道性能会受到影响,但这会减少编程时间,你怎么看?

【问题讨论】:

  • IMO 它为您提供了一个未定义的接口,使该类只不过是一个花哨的数组。显式 getter 和 setter 的优点之一是它们提供的严格定义的接口。这不仅有助于 IDE 自动完成,还有助于保持整个代码库的健全。

标签: php


【解决方案1】:

正如你所说,性能会下降,但更好的设计总是胜过性能。具有更多 RAM 和 CPU 的服务器并不像开发人员那样昂贵。

如果您需要动态调用的方法,我认为这是一个很好的观点。 ,但是,它应该通过 PHP Doc 进行详细记录(它有助于 IDE 完成代码,开发人员不需要 1 小时即可理解)。仅当您无法使用此 PHP 文档对其进行记录时才会出现这种情况(方法名称是什么?返回类型是什么?)

/*
 * @method myReturnType $myMethodName
 * @property myReturnType $myPropertyName
 */
class Foo {}

如果你的方法可以静态创建,你应该这样做。

您的要点是关于 getter 和 setter,它们是通过 __call 自动创建的,没有额外的逻辑。 getter 和 setter 的好处是,您可以在设置或获取之前使用该值。在这种情况下,你不能。所以我会考虑这个糟糕的设计。如果您将字段设为公开而不是受保护,则结果会相同。


旁注:IDE 之类的 PHP Storm 可以自动为您创建 Setter 和 Getter,如果您写的是 protected $_foo;(在这种情况下,只需在字段上按 ALT+ENTER

结果:

protected $_foo;

/**
 * @return mixed
 */
public function getFoo()
{
    return $this->_foo;
}

/**
 * @param mixed $foo
 */
public function setFoo($foo)
{
    $this->_foo = $foo;
}

如果您通过 PHP 文档或直接赋值 (protected $foo = true) 定义类型,生成的 PHP 文档甚至会写入 @param bool $foo@return bool 而不是 mixed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多