> On Nov 17, 2019, at 2:27 PM, Rowan Tommins <rowan.coll...@gmail.com> wrote: > Well, pretty much any method that returns array *could* be called "to array", > but not many would be good candidates for such a generic name. You might > return an array structure to be incorporated into a JSON response, or to be > passed to a template renderer, or to map to database columns, etc. > > The only case I can think of where a generic "toArray" method would make > sense is if you're creating a general-purpose "collection" or "list" object, > in which case you're probably better off directly implementing methods like > map and sort, rather than encouraging users to convert it back to a plain > array. It doesn't seem like a common enough use case to need a new language > feature, when it's simple enough to write "$foo->toArray()" without anything > new.
I have been pondering that objection ever since Steven Wade proposed __toArray() on the list a few months back. In part I agree with the sentiment, and in part I feel that perfection is being the enemy of the good here. But as I had no strong argument for how it could be done better I did not say anything on the matter. Consider this: __toArray() is hardly a rare case where a short name can be applied in multiple contexts. We have infinite contexts where we need to name methods for one context that might conflict with others, and so I have been agonizing for years over how to deal with this conundrum without resorting to really long method names. (As an aside, I think long method names result in harder to comprehend code, and as I have never seen a set of conventions that results in multiple programmers (almost) always choosing the same long names for the same use-cases I prefer our standards to suggest shorter names so that we can maintain more consistence across programmers.) Recently I have been experimenting with using namespaces instead of long method names, and I think using them can result in the best of both worlds and resolve your concern. Consider the following classes, each of which could have their own __toArray() method specific to their use-case: \Widgets\Widget \Widgets\JSON\Widget \Widgets\Mustache\Widget \Widgets\DbColumns\Widget With the above you can "have your cake and eat it too." Your namespace can specify the exact context for your __toArray() and thus developers who want to use that architecture can get the benefits of a __toArray() magic method. #jmtcw -Mike