问题
假设您有一个类用户。您希望能够将此用户对象返回给其他人,以便他们可以使用它来使用getter提取信息。但是,您不希望人们能够轻松设置内部状态,因为内部信息应直接与数据库中的行相关。有受保护的mutator(setter)是否有意义,只有扩展类可以设置变量?这是一种不好的做法,无关紧要,矫枉过正还是无用?
我考虑过将__construct限制为一次使用(我相信这有时会被视为单身模式 - 虽然我不确定我是否完全理解。)
我是业余的程序员,原谅任何无知。感谢。
示例:
<?php
class user
{
private username;
protected function set_username($username)
{
$this->username = $username;
}
public function get_username()
{
return $this->username;
}
?>
答案 0 :(得分:2)
取决于。如果在状态发生变化时没有特别需要发生的事情,那么你可以完全放弃设置者。任何子类都可以直接访问设置为protected或looser的属性。
如果您需要在状态发生变化时发生某些事情(例如,当状态发生变化时发生数据库更新),那么设置者将使您的生活变得更加轻松,因为对数据库更新代码的调用将放入设置器中。这意味着如果您总是通过setter,那么当您更改对象的状态时,DB将始终更新。
总之,这取决于。
答案 1 :(得分:0)
如果你有一个接受id的构造函数,为什么你想要有setter。没有规则强迫你给对象设置器只是因为它有getter。如果你的用例是在某个地方构建对象,之后只用它来从中提取数据,那么根本就不创建setter。
扩展对象可以操纵受保护的类变量本身,因此它们也不需要任何形式的setter。如果您不希望“外部世界”能够在课堂上设置某些内容,请不要允许它。
答案 2 :(得分:0)
你的代码总体上很好,恕我直言它完美封装。 Tt还支持松耦合。
为了便于使用,您可以添加所有必需(必须具有)成员作为构造函数参数。
关于单身人士模式,请谨慎使用。共同的用户不是单身人士。请参阅重构模式(Joshua Kerievsky)。