【问题标题】:Protected mutators (setters)受保护的变异器(设置器)
【发布时间】:2012-01-13 07:17:30
【问题描述】:

问题

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

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

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

示例:

<?php

    class user
    {

    private username;

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

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

?>

【问题讨论】:

  • privateprotected 声明,不是为了增加代码的安全性。

标签: php oop getter-setter mutators


【解决方案1】:

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

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

简而言之,这取决于。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我赞成使用 __construct 而不是拥有许多 setter。但是,不能从外部调用 __construct 来简单地更改变量吗?这将简单地使用不映射到数据库中保存的实际内容的信息重新构建类 ->(我正在考虑的目标)。
      • 您可以按照手册de.php.net/manual/en/language.oop5.decon.php中的说明创建多个构造函数
      猜你喜欢
      • 1970-01-01
      • 2013-06-19
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多