No creo que haya ninguna ventaja razonable de utilizar un stdClass sobre un arsenal siempre que su única intención es devolver varios tipos de datos arbitrarios de una llamada a la función.
Dado que técnicamente no puede devolver múltiples valores de forma nativa, debe usar un contenedor que pueda contener todos los demás tipos de datos disponibles en PHP. Eso sería un objeto o una matriz.
function fn1() { return array(1,2); }
function fn2() { return array('one' => 1, 'two' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array('one' => 1, 'two' => 2); }
Todo lo anterior funcionaría. La matriz es una pequeña fracción insignificante más rápida y menos trabajo de tipeo. También tiene un propósito claramente definido en contraste con el stdClass genérico (que es un poco desagradable, ¿verdad?). Ambos solo tienen una interfaz implícita, por lo que tendrás que mirar los documentos o el cuerpo de la función para saber qué contendrán.
Si desea utilizar objetos a cualquier costo, puede usar ArrayObject o SplFixedArray, pero si mira sus API, ¿diría que necesita su funcionalidad para la simple tarea de devolver valores múltiples aleatorios? No lo creo. Sin embargo, no me malinterprete: si quiere usar stdClass, entonces úselo. No es como si rompiera cualquier cosa. Pero tampoco ganarías nada. Para agregar al menos algún beneficio, puede crear una clase separada denominada ReturnValues para esto.
podría ser una clase simple etiquetado
class ReturnValues {}
o algo más funcional
class ReturnValues implements Countable
{
protected $values;
public function __construct() { $this->values = func_get_args(); }
public function __get($key) return $this->values[$key]; }
public function count() { return count($this->values); }
}
Por supuesto, no hace mucho y conseguir los valores fuera de él todavía se realiza a través de una interfaz implict , pero al menos la clase tiene ahora una responsabilidad más claramente definida. Se podría extender de esta clase para crear objetos ReturnValue para determinadas operaciones y dar a aquellos de una interfaz explícita:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
Ahora el desarrollador sólo tiene que mirar a la API para saber qué valores múltiples foo() devolverá. Por supuesto, tener que escribir clases concretas de ReturnValue para cada operación que pueda devolver múltiples valores puede volverse tedioso rápidamente. Y personalmente, creo que esto se inventó para el propósito inicial.
De todos modos, espero que tenga sentido.
ver: http://stackoverflow.com/questions/2056931/value-objects-vs-associative-arrays-in-php No responde mi pregunta. Él dice que una clase "real" sería el mejor enfoque, que (creo) todos estamos de acuerdo. Me gustaría saber "cuándo" el uso de stdClass devuelve valores es mejor que las matrices. – JonG
es posible que desee aclarar su concepto de objetos de valor. [En DDD, un objeto de valor es inmutable] (http://domaindrivendesign.org/node/135) y el propósito es bastante diferente de [VOs en Java.] (Http://java.sun.com/j2ee/patterns/ ValueObject.html) – Gordon
@Gordon Lo que quise decir fue una guía de retorno "VO-like" de las funciones. Tener un VO como un objeto (preferiblemente) pequeño, donde solo sus atribuciones son importantes, no su identidad. Acerca de sus enlaces, ¿estaba tratando de averiguar si para mí (mi pregunta) era importante la discusión sobre "VO debe ser inmutable Vs VO puede ser mutable"? Por cierto, hoy en día los VO son A (objetos de transferencia) para el sol. http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html – JonG