3

问题

假设您有一个类用户。您希望能够将此用户对象返回给其他人,以便他们可以使用它来使用 getter 提取信息。但是,您不希望人们能够轻松设置内部状态,因为内部信息应该直接与数据库中的行相关。拥有受保护的变异器(设置器)是否有意义,以便只有扩展类才能设置变量?这是一种不好的做法,无关紧要,矫枉过正还是没用?

我考虑过尝试将 __construct 限制为一种用途(我相信这有时被称为单例模式——尽管我不确定我是否完全理解。)

我是一个业余程序员,请原谅任何无知。谢谢。

例子:

<?php

    class user
    {

    private username;

    protected function set_username($username)
    {
        $this->username = $username;
    }

    public function get_username()
    {
        return $this->username;
    }

?>
4

3 回答 3

2

依靠。如果在状态更改时不需要发生任何特别的事情,那么您可以完全将设置器排除在外。任何子类都可以直接访问设置为受保护或更宽松的属性。

如果您需要在状态更改时发生某些事情(例如,当状态更改时发生数据库更新),那么设置器将使您的生活变得更加轻松,因为对数据库更新代码的调用被放在设置器中。这意味着如果您总是通过设置器,那么当您更改对象的状态时,数据库将始终更新。

所以简而言之,这取决于。

于 2012-01-13T07:22:45.617 回答
0

例如,如果您有一个接受 id 的构造函数,那么您为什么要拥有 setter。没有规则强迫你仅仅因为一个对象有 getter 就给它设置器。如果您的用例在某处构造对象,然后仅使用它从中提取数据,则根本不创建 setter。

扩展对象可以操作受保护的类变量本身,因此它们也不需要任何形式的 setter。如果您不希望“外部世界”能够为班级设置某些内容,请不要允许。

于 2012-01-13T07:23:35.647 回答
0

您的代码完全没问题,恕我直言,它完美封装。Tt 还支持松散耦合。

为了更容易使用,您可以添加所有需要(必须具有)的成员作为构造函数参数。

关于单例模式,请谨慎使用。共同的用户不是单身人士。请参阅重构模式 (Joshua Kerievsky)。

于 2012-01-13T07:24:06.097 回答