getter与setter的意义

2015-05-12  来源:本站原创  分类:PHP  人气:336 

很多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能为以后的维护节约非常的多的成本,何乐而不为

相关文章
  • getter与setter的意义 2015-05-12

    很多php码农不知道getter和setter的意义在哪里,认为写getter和setter完全是画蛇添足.所以在使用php的类的时候喜欢定义一个公开属性,比如 <?php class User { public $id; public $username; public $group } 这样的方式去定义,然后通过 $user = new User(); $id = $user->id; 这样的方式去调用属性.这样写确实很方便,开发的时候能节省不少的代码.然而这样的写法会引出一个维护的问题.

  • ECMAScript5中的对象存取器属性:getter和setter介绍 2014-03-09

    这篇文章主要介绍了ECMAScript5中的对象属性存取器:getter和setter介绍,事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都可以被getter和setter方法所取代,这被称之为"存取器属性",需要的朋友可以参考下 显然这是一个无关IE(高级IE除外)的话题,尽管如此,有兴趣的同学还是一起来认识一下ECMAScript5标准中getter和setter的实现.在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.get,这就是一个

  • 关于 getter 和 setter 2014-01-19

    网友 "sjinny" 在上篇评论里写: 云风对那种所有成员数据都写setter/getter的做法有什么看法吗--这两天试图精简三个太庞大的类,但是单单setter/getter就让接口数目变得非常多了-- 我谈谈我的看法吧. 首先,几乎任何设计问题都没有标准答案.如果有,就不需要人来做这件事了.无论多复杂的事情,只要你能定义出精确的解决方案,总可以用机器帮你实现. 下面谈谈我的大体设计原则.记住.一切皆有例外,但这里少谈例外.因为这涉及更复杂的衡量标准. KISS 当然是首要原则.

  • 利用Eclipse来自动生成JavaBean的getter和setter方法 2014-06-12

    写JavaBean的时候,写getter和setter方法是一件简单而无趣的活儿.利用Eclipse的code(源代码)功能可以自动生成JavaBean的getter和setter方法,这样可以使得我们不必要再将宝贵的时间花在写getter和setter方法上. 操作步骤: 定义一个class,比如TestBean.先定义好属性(字段),再定义好构造方法,类似: public TestBean { private String name; private String password; pri

  • JavaScript Getter And Setter 2015-01-20

    JavaScript Getters and Setters 23 December 2013 by Jack Franklin For the most part, in JavaScript, what you see is what you get. A value's a value; there are no tricks. Sometimes however, you want a value that's based on some other values: someone's

  • (1) reflection getter And setter 2010-08-03

    Recently launched a small package, a lot of ways, using the process, found that the benefits of emission is: When a lot of class there is common, the use of emission, can be achieved only do once, use everywhere the effect. The same as Hibernate, sav

  • Socket类的getter和setter方法 2013-01-24

    在Java 类中,get ter和set ter方法占了很大的比重.由于Java 中没有定义属性的关键字:因此,get ter和set ter方法用于获得和设置Java 类的属性值: 如getName 和setName方法用于设置name属性的值 .如果某个属性只有get ter方法,那这个属性是只读的:如果只有set ter方法,那么这个属性是只写的.在Socket 类中也有很多这样的属性来获得和Socket 相关的信息,以及对Socket 对象的状态进行设置. 一.用于获得信息的getter

  • ActionScript for setter / getter 2010-06-18

    getter and setter methods of the syntax is as follows: * Getter method can not be any arguments, and always return a value. * Setter method always with a parameter, and never returned. Class is usually defined getter methods and setter methods are av

  • 实现了一个PHP5的getter/setter基类的代码 2014-02-08

    PHP3.PHP4都拥有类,但它们的类定义的实在很不像样,效率还挺难为情的,但资料上说PHP5重新构造了面向对象的支持,尽管并不是完全面向对象,但也算能拿出来见人了. 昨天晚上闲着无聊便弄起这玩意,感觉PHP5增加的类成员权限关键字挺好,但问题又来了,似乎还没一种方便的方式可以定义字段的getter以及setter,传统的方式是这样定义的: class a { private $field; public function get_field() { return $this->$field;

  • 自动生成getter setter 2013-02-12

    如何使用java黑魔法给一个entity生成getter,setter方法? 由于java是一门静态语言,要给一个类动态添加方法,看似是不可能的.但牛B的程序员会让任何事情发生.我只知道有两种方式可以做到,一种是字节码加强,借助asm包:另一种是运行期加强,借助javassist包.下面,尝试用第二种方法,完成一个简单的demo. 大致思路如下:先在Filter类里扫描工程得到所有实体类,通过创建自定义类加载器加载实体类 ,在加载的过程中通过javassist给每个实体类添加getter set

  • Hibernate parsing bean when Could not find a getter exceptions to solve 2010-04-11

    net.sf.hibernate.PropertyNotFoundException: Could not find a getter for oProduct in class There are several reasons of this anomaly, one of which is: get / set method name is not allowed a continuous period of two capital letters. For example here oP

  • [Objective-C]iOS开发中常见的语句@synthesize obj=_obj的意义详解 2014-02-27

    在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则会得到类似下面的编译错误: Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar 在 64-bit时,运行时系统会自动给类添加 ivar,添加的

  • Java 理论与实践: 用动态代理进行修饰 2014-02-09

    简介:动态代理工具 是 java.lang.reflect 包的一部分,在 JDK 1.3 版本中添加到 JDK,它允许程序创建 代理对象,代理对象能实现一个或多个已知接口,并用反射代替内置的虚方法分派,编程地分派对接口方法的调用.这个过程允许实现"截取"方法调用,重新路由它们或者动态地添加功能.本期文章中,Brian Goetz 介绍了几个用于动态代理的应用程序. 动态代理为实现许多常见设计模式(包括 Facade.Bridge.Interceptor.Decorator.Proxy

  • Python中的Numeric包和Numarray包使用教程 2014-02-27

    这篇文章主要介绍了Python中的Numeric包和Numarray包使用教程,来自IBM官方网站上的技术文档,需要的朋友可以参考下 要了解 Numerical Python 软件包的第一件事情是,Numerical Python 不会让您去做标准 Python 不能完成的任何工作.它只是让您 以快得多的速度去完成标准 Python 能够完成的相同任务.实际上不仅仅如此:许多数组操作用 Numeric 或者 Numarray 来表达比起用标准 Python 数据类型和语法来表达要优雅得多.不过,

  • 冒号和他的学生们-程序员提高班纪事23:数据抽象 2014-06-17

    系列文章汇总:<冒号和他的学生们--程序员提高班纪事> 数据抽象 善张网者引其纲,不一一摄万目而后得 --<韩非子·外储说右下> 问号抢着说:"我知道了:过程抽象的结果是函数,数据抽象的结果应该是数据类型." 冒号首肯:"数据类型与数据运算是程序语言的基本要素,除了内建的类型与运算外,程序语言还提供了用户定义(user-defined)的扩展机制,以提高编程者的效率.正如函数是一些基本运算的复合,自定义类型通常是一些基本类型的复合.不过单纯的复合类型并

  • Java反射机制的实现详解 2014-07-03

    反射主要解决动态编程,即使用反射时,所有的对象生成是动态的,因此调用的方法也是动态的.反射可以简化开发,但是代码的可读性很低 很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术. 与反射有关的类包. java.lang.reflect.*;和java.lang.Class; Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class.即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共

  • 重温C# clr 笔记总结 2014-07-26

    本篇文章是对以前学习C# clr做的一些笔记,现在拿出来和大家分享下,希望需要的朋友能参考一下 1: .net framework 由两个部分组成:CLR 和 FCL. 2:在CLR中,所有错误都是通过异常来报告的. 3:智能感知功能主要是靠解析元数据实现的. 4:允许在不同语言之间方便的切换,并对各种语言进行紧密集成是CLR的出色特性. 5:一个方法只有在首次运行时才会由于jit造成一定的性能损失,以后对该方法的调用都以本地代码的形式全速运行. 6:方法签名指定了参数的数量(及其顺序),参数的

  • Python魔术方法详解 2014-09-09

    这篇文章主要介绍了Python魔术方法详解,本文讲解了构造和初始化.用于比较的魔术方法.数值处理的魔术方法.普通算数操作符等内容,需要的朋友可以参考下 介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加"magic"的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Python中所有的魔术方法均在Python官方文档中有相应描述

  • 让Apache Shiro保护你的应用 2014-10-27

    本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方法.本文还解释了Apache Shiro的项目目标.架构理念以及如何使用Shiro为应用安全保驾护航 在尝试保护你的应用时,你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用,只会让你更糊涂?本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方法.本文还解释了Apache Shiro的项目目标.架构理念以及如何使用Shiro为应用安全保驾护

  • Swift hello world!Swift快速入门教程 2014-11-01

    这篇文章主要介绍了Swift hello world!Swift快速入门教程,本文在快速了解Swift编程语言,需要的朋友可以参考下 通常来说,编程语言教程中的第一个程序应该在屏幕上打印"Hello, world".在 Swift 中,可以用一行代码实现: println("hello, world") 如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式--在 Swift 中,这行代码就是一个完整的程序.你不需要为了输入输出或者字符串处理导入