Php 受保护的变异子(设置器)

Php 受保护的变异子(设置器),php,oop,getter-setter,mutators,Php,Oop,Getter Setter,Mutators,问题 假设您有一个类用户。您希望能够将此用户对象返回给其他人,以便他们可以使用它来使用getter提取信息。但是,您不希望人们能够轻松地设置内部状态,因为内部信息应该直接与数据库中的一行相关。让受保护的变数(setter)只有扩展类才能设置变量有意义吗?这是一种不好的做法,无关紧要的,过度的还是无用的 我曾考虑尝试将_构造限制为一种用途(我相信这有时被认为是一种单例模式——尽管我不确定是否完全理解) 我是一个业余程序员,请原谅我的无知。谢谢 示例: <?php class use

问题

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

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

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

示例:

<?php

    class user
    {

    private username;

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

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

?>

视情况而定。如果在状态改变时没有什么特别需要发生的事情,那么您可以将setter完全排除在外。任何子类都可以直接访问设置为protected或looser的属性

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


因此,简言之,这要视情况而定

例如,如果您有一个接受id的构造函数,那么为什么要使用setter呢。没有规则强迫你仅仅因为对象有getter就给它设置setters。如果您的用例是在某处构建对象,并且之后只使用它从中提取数据,只需不创建setter即可


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

您的代码非常好,而且封装得非常完美。Tt还支持松耦合

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


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

private
protected
状态并不是为了给代码增加安全性。我赞成使用一个u构造,而不是有许多setter。但是,不能从外部调用_构造来简单地更改变量吗?这将简单地用与数据库->中保存的内容(我的目标)不匹配的信息重新构造类。您可以按照手册中的说明创建多个构造函数