getter与setter的意义

原创
2015/05/12 14:16
阅读数 240

很多php码农不知道getter和setter的意义在哪里,认为写getter和setter完全是画蛇添足。所以在使用php的类的时候喜欢定义一个公开属性,比如

<?php
class User {
    public $id;
    public $username;
    public $group
}

这样的方式去定义,然后通过

$user = new User();
$id = $user->id;

这样的方式去调用属性。这样写确实很方便,开发的时候能节省不少的代码。然而这样的写法会引出一个维护的问题。例如:

场景一:

<?php
//发送短信
$use = new User();
$sender = new SMSSender();

$sender->setToUser($user->username)->send();


场景二:

<?php
//发送邮件
$user = new User();
$sender = new EmailSender();

$sender->setToAddress($user->email)->send();

在上面两个场景中,似乎没啥问题。突然有一天,你的老板抽了,说我们的username全部取消,统一使用email。那么问题来了,你要找出所有$user->username的地方全部改为$user->email。在一个真正的项目中,不仅仅是两个地方会用到这样的代码,有可能成百上千个。这些你都要一个一个的找出来全部改掉,还不能遗漏,否则就会留下bug。


上述类似的应用场景想必不少码农都遇到过。假设我们在写代码的时候使用getter和setter就能很好的解决上述问题。

我们重新定义User

<?php
class User {
    protected $id;
    protected $username;
    protected $email;
    
    public function getId()
    {
        return $this->id;
    }
    
    public function getUsername()
    {
        //user的getter返回了email
        return $this->getEmail();
    }
    
    public function getEmail()
    {
        return $this->email;
    }
}


场景一:

<?php
//发送短信
$use = new User();
$sender = new SMSSender();

$sender->setToUser($user->getUsername())->send();


场景二:

<?php
//发送邮件
$user = new User();
$sender = new EmailSender();

$sender->setToAddress($user->getEmail())->send();


使用username的地方都会获取到email。


总结,善用getter与setter能帮助我们建立更具维护性的代码。写代码并不是在开发的时候简便就行了,同样要思考以后维护的成本。初期多几行代码,多几个字母,写两个getter和setter能为以后的维护节约非常的多的成本,何乐而不为

展开阅读全文
打赏
0
2 收藏
分享
加载中

引用来自“纳兰清风”的评论

那如果其他的地方需要username怎么破?返回一个email?
都举例说需求上要取消username了,仔细看
2015/05/12 22:40
回复
举报
那如果其他的地方需要username怎么破?返回一个email?
2015/05/12 20:47
回复
举报

引用来自“工头叫我去搬砖”的评论

$user->getUsername() 实际返回 email地址,这个语义上有问题的呀,可维护性也不高
如果一开始需求上就不使用username的话,也不会发生你说的语义问题。还是那个问题《维护性》
2015/05/12 16:49
回复
举报

引用来自“工头叫我去搬砖”的评论

$user->getUsername() 实际返回 email地址,这个语义上有问题的呀,可维护性也不高
这样的目的是为了保留维护性,至于语义上的问题,要修改要语义化必须挪到重构阶段。但是一个成熟的项目能动不动就重构?这里只是举例而已。说的是思想而不是针对user和email的语义
2015/05/12 16:48
回复
举报
$user->getUsername() 实际返回 email地址,这个语义上有问题的呀,可维护性也不高
2015/05/12 15:43
回复
举报
更多评论
打赏
5 评论
2 收藏
0
分享
返回顶部
顶部