On 6/1/2016 5:47 PM, Ryan Pallas wrote:
> On Wed, Jun 1, 2016 at 9:37 AM, Matt Fonda <matthewfo...@gmail.com> 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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to