php设计模式介绍之值对象模式第2/5页

 更新时间:2008年04月13日 22:10:17   作者:  
在所有的最简单的程序中,大多数对象都有一个标识,一个重要的商业应用对象,例如一个Customer或者一个SKU,有一个或者更多的属性---id,name,email地址,这样可以把它从同一个类的其他实例区分开来。此外,对象有一个恒定的标识:它是贯穿于整个应用程序的一个唯一的标识,对于程序员来说,”customer A”在任何地方就是”customer A”,并且只要你的程序在持续运行时"customer A"仍然是"customer A"。 但是一个对象不需要有一个标识。有些对象仅仅是为了描述其他对象的属性。

问题:

那么,你该如何为Date或Dollar这样一些描述简单的应用定义一个高效的类,并且易于创建呢。

解决方案:

高效的对象应该像PHP的整型那样运作:如果你把同一个对象资源赋值给两个不同的变量,然后改变其中的一个变量,另一个变量仍然不受影响。事实上,这就是Value Object模式的目标所在。

执行Value Object时,php4和php5是有区别的。

正如以上你所看到的,PHP5通过new进行对象资源的赋值传递的是对象资源的指针就像我们在PHP4中通过指针传递一样。很明显,这是一个问题。为了解决那个问题并实现一个专有对象Dollar的值,我们必须使属性$amount的对象的所有属性的一个值在一般情况下不可变或不能改变。但是在PHP语言的没有提供参数不可改变的功能的情况下,你完全可以结合属性的可见性与获得和设置方法来实现。

 相反地,PHP4操作所有的对象都是遵循Value Objects对象规律的,因为PHP4的赋值操作相当于对对象做了一个拷贝。所以为了在PHP4中实现Value Objects设计模式你需要打破你细心地培养的通过指针赋值来创建、传递、提取对象的习惯。

注:术语 不可变的(Immutable):

在词典中Immutable的定义是不允许或不易受影响。在编程中,这个术语表示一个一旦被设置就不能改变的值。

PHP5 样本代码:

既然我们开始用PHP5编写代码,让我们优化一个PHP5的Value Object的实例并创建一个较好的Dollar类定义。命名在面向对象编程中非常重要,选择一个唯一的货币类型作为这个类的名字,说明它不被定义为可以处理多种货币类型的类。

class Dollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount;
}
public function getAmount() {
return $this->amount;
}
public function add($dollar) {
return new Dollar($this->amount + $dollar->getAmount());
}
}
类里面的属性如果加上protected前缀,别的类是访问不了的。protected(和private)拒绝通过属性直接被访问。

通常,当你使用面向对象进行编程的时候,你经常需要创建了一个“setter”函数,就类似于:

public setAmount($amount)
{
  $this->amount=$amount;
}
一样,在这种情况下,虽然没有设定函数Dollar::amount(),但在对象的实例化期时,参数Dollar::amount就已经被赋值了。而函数Dollar::getAmount()只是提供一个访问Dollar属性的功能,在这里访问的数据类型为浮点型。

最有趣的变化是在Dollar::add()方法函数中。并不是直接改变$this->amount变量的值从而会改变已存在的Dollar对象实例,而是创建并返回一个新的Dollar实例。现在,尽管你指定当前对象给多个变量,但是每一个变量的变化都不会影响其它的变量实例。

对于价值设计模式不变性是关键,任何对于一个Value Object的变量amount的改变,是通过创建一个新的带有不同预期值的类的实例来完成的。上文中提高的最初那个$this->amount变量的值从未改变。

简单来说,在PHP5里面使用价值设计模式时,需要注意以下几个方面:

保护值对象的属性,禁止被直接访问。 
在构造函数中就对属性进行赋值。 
去掉任何一个会改变属性值的方式函数(setter),否则属性值很容易被改变。 
以上三步创建了一个不变的值,这个值一旦被初始化设置之后就不能被改变。当然,你也应该提供一个查看函数或者是访问Value Object的属性的方法,并且可以添加一些与这个类相关的函数。值对象并不是只能用在一个简单的架构上,它也可以实现重要的商务逻辑应用。让我们看看下一个例子:

相关文章

  • php中stdClass的用法分析

    php中stdClass的用法分析

    这篇文章主要介绍了php中stdClass的用法,实例分析了stdClass的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 简单介绍win7下搭建apache+php+mysql开发环境

    简单介绍win7下搭建apache+php+mysql开发环境

    这里给大家介绍的是Win7下搭建“PHP+Apache+MySql”网站运行环境详细方法步骤,十分的细致全面,有需要的小伙伴可以参考下。
    2015-08-08
  • 在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境

    在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境

    这篇文章主要介绍了在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境,需要的朋友可以参考下
    2016-04-04
  • php无限级分类实现方法分析

    php无限级分类实现方法分析

    这篇文章主要介绍了php无限级分类实现方法,结合2个简单实例形式分析了php通过递归与普通算法实现无限级分类的相关操作技巧,需要的朋友可以参考下
    2016-10-10
  • PHP XML操作类DOMDocument

    PHP XML操作类DOMDocument

    不得不自已写一个.XML 的操作一直没有用过.下面是自己搜集的XML操作类
    2009-12-12
  • PHP递归算法的详细示例分析

    PHP递归算法的详细示例分析

    我们在建设一个网站的时候,程序员们首选的当属PHP语言。我们对PHP还是比较熟悉的,接下来我们将会为大家介绍一下PHP递归算法
    2013-02-02
  • php实现Linux服务器木马排查及加固功能

    php实现Linux服务器木马排查及加固功能

    这篇文章主要介绍了php实现Linux服务器木马排查及加固功能,本文给出了根据特征码查找、搜索最近被修改的文件、修改php.ini、修改nginx.conf等方法,需要的朋友可以参考下
    2014-12-12
  • 统计PHP目录中的文件数方法

    统计PHP目录中的文件数方法

    在本文里小编给大家分享了关于统计PHP目录中的文件数方法和相关知识点,有需要的朋友们参考下。
    2019-03-03
  • php中get_object_vars()方法用法实例

    php中get_object_vars()方法用法实例

    这篇文章主要介绍了php中get_object_vars()方法用法,实例分析了get_object_vars()方法获取对象中属性的使用技巧,需要的朋友可以参考下
    2015-02-02
  • php去除字符串中空字符的常用方法小结

    php去除字符串中空字符的常用方法小结

    这篇文章主要介绍了php去除字符串中空字符的常用方法,实例分析了php中的trim()、ltrim()、rtrim()及chop()等函数的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03

最新评论