2012-03-23 17 views
5

He leído muchos ejemplos de C# de Value Objects, y entiendo que es un "objeto" que se identifica por sus valores. Si un valor cambia, el objeto es "nuevo".¿Qué es un ejemplo de objeto de valor en PHP?

Sin embargo, eso no parece tener sentido cuando se trata de PHP ... o eso, o simplemente no estoy haciendo la conexión.

¿Es un objeto de valor solo una cadena?

+0

No todo en PHP es un objeto. –

+0

Me doy cuenta de eso. Solo intento dar sentido a algunos tutoriales que he estado leyendo que hablan de Value Objects. – johnnietheblack

+0

Pero no todo en PHP es un objeto, lo que hace que la comparación no sea válida. –

Respuesta

17

Para poner esto en contexto, en muchos lenguajes OO, los objetos se comparan por su identidad . En pseudocódigo:

bar = new Foo 
baz = new Foo 

bar == baz // false 

A pesar de que ambos objetos son básicamente lo mismo si sólo se observa en sus valores , no son considerados como iguales, porque son casos separados. Para demostrar:

bar = new Foo 
baz = bar 

bar == baz // true 

Ahora:

En informática, un objeto de valor es un simple objeto pequeño, como dinero o un intervalo de fechas, que la igualdad no se basa en la identidad.

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

esto sería una demostración de "objetos de valor":

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

address1 == address2 // true 

Debido a que los valores son los mismos, ambos objetos se consideran iguales, incluso si son instancias independientes.

PHP no tiene un concepto separado de "objetos de valor", solo tiene un tipo de objeto. Sin embargo, su operador de comparación puede hacer esa distinción:

Al utilizar el operador de comparación (==), las variables de objeto se comparan de manera simple, a saber: dos instancias de objetos son iguales si tienen los mismos atributos y valores, y son instancias de la misma clase.

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

ej .:

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

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

+1 por una respuesta muy bien escrita e informativa – max

+0

ESO es lo que necesitaba. ¡Gracias! – johnnietheblack

+0

@johnnietheblack: Tenga en cuenta que en C# la distinción * también * se basa principalmente en el método de comparación Equals(), que en System.Object compara para la identidad, pero que System.ValueType anula para comparar el contenido. –