PHP中一个值对象的例子是什么?

9
我读过很多关于C#值对象的例子,我理解它是一个由其值标识的“对象”。如果值更改,则对象为“新”。 然而,当涉及到PHP时,这似乎并不合理...或者说我没有建立联系。 一个值对象只是一个字符串吗?

并非 PHP 中的所有内容都是对象。 - Ignacio Vazquez-Abrams
我明白。我只是在努力理解一些教程,它们谈到了值对象。 - johnnietheblack
但并非 PHP 中的所有内容都是对象,这导致比较无效。 - Ignacio Vazquez-Abrams
如果我正在阅读“语言无关”的教程,那么在我的脑海中,我应该用什么替换“Value Object”这个短语?当有人说一个Person对象有一个Address Value对象时,我是否应该假设在我的世界里,这只是简单地转换为Person内的属性?谢谢 :) - johnnietheblack
5
@Ignacio Vazquez-Abrams:并非 C# 中的所有内容都是对象,这与此问题绝对无关。 - Michael Borgwardt
2个回答

29

为了让这更加容易理解,在许多面向对象语言中,对象是按照它们的身份进行比较的。伪代码如下:

bar = new Foo
baz = new Foo

bar == baz  // false

尽管两个对象在值上看起来基本相同,但它们不被认为是相同的,因为它们是不同的实例。为了证明:

bar = new Foo
baz = bar

bar == baz  // true

现在:

在计算机科学中,值对象是一个小而简单的对象,比如货币或日期范围,它们的相等性不是基于身份。

http://en.wikipedia.org/wiki/Value_object

这将演示“值对象”:

address1 = new Address('Main street 42')
address2 = new Address('Main street 42')

address1 == address2  // true

因为这两个对象的值相同,即使它们是分开的实例,它们也被认为是相等的。

PHP没有单独的“value objects”概念,它只有一种类型的对象。然而,它的比较运算符可以区分它们:

当使用比较运算符(==)比较对象变量时,它们会以简单的方式进行比较,即:如果两个对象实例具有相同的属性和值,并且是同一个类的实例,则它们相等。

http://www.php.net/manual/en/language.oop5.object-comparison.php

例如:

$address1 = new Address('Main street 42');
$address2 = new Address('Main street 42');

$address1 == $address2;  // true     equal...
$address1 === $address2;  // false   ...but not identical

@johnnietheblack:请注意,在C#中,区别主要取决于比较方法Equals(),在System.Object上它比较标识符,但在System.ValueType上重写以比较内容。 - Michael Borgwardt
有许多存储库可用于在PHP中创建VO。这是我的实现:https://github.com/sensorario/value-object - sensorario

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接