On 6/1/2016 5:47 PM, Ryan Pallas wrote: > On Wed, Jun 1, 2016 at 9:37 AM, Matt Fonda <[email protected]> wrote: >> >> >> Hi Jesse, >> >> It's fairly straightforward to implement a function that does this in >> userland, for example something like the following: >> >> function f($fqcn, $args) { >> $instance = new $fqcn; >> foreach ($args as $key => $value) { >> $instance->$key = $value; >> } >> return $instance; >> } >> ... >> $this->fooMethod( >> $arg1, >> $arg2, >> f('FooParams', [ >> 'prop1' => ..., >> 'prop2' => ..., >> 'prop3' => f('Obj1', [ >> 'prop1' => ..., >> 'prop2' => ..., >> ], >> ]) >> ); >> >> You may also use the approach Peter suggested. As such, I don't think >> introducing a new syntax for it is necessary. >> > > I disagree here. This lets you add dynamic properties accidentally (by > putting too many entries in the array or misspelling a property as a key), > this method does not let IDEs help you with the construction of the array, > or even what's valid for each value in that array and doesn't provide any > language level protection against misspelled properties. Of course, for the > last point, I'm assuming that this idea works like the following: > > class Foo { > public $prop1; > } > > new Foo () { > porp1 = 'foo' // undefined property error of some sort > }; > > >> Best, >> --Matt >> >
Still generically solvable in userland with creativity. :)
trait ObjectFromArray {
public static function fromArray(array $array, ...$params) {
$object = new static(...$params);
foreach ($array as $k => $v) {
if (property_exists($object, $k)) {
$object->{$k} = $v;
}
else {
trigger_error('fubar', E_USER_ERROR);
}
}
return $object;
}
}
class SomeObject {
use ObjectFromArray;
private $foo;
}
SomeObject::fromArray(['foo' => 'bar', 'bar' => 'foo']);
--
Richard "Fleshgrinder" Fussenegger
signature.asc
Description: OpenPGP digital signature
