如何使用方法参数自动分配PHP类参数值?

Does anyone know of an efficient technique in PHP to auto assign class parameters with identically named __construct() method arguments?

For instance, I've always thought it was highly inefficient to do something like the following:

<?php

class Foo
{
    protected $bar;
    protected $baz;

    public function __construct($bar, $baz)
    {
        $this->bar = $bar;
        $this->bak = $baz;
    }
}

I'm wondering if there's a better/more efficient way/magic method to auto-assign class properties with identically named method parameters.

Thanks,

Steve

I think this way is a pretty generally accepted way to do it, although you could make getters and setters. Or, if you're looking for magic methods in php: http://php.net/manual/en/language.oop5.magic.php

Not in a constructor. You can always wrap your properties into an array, instead, and only have a single property that needs to be set:

<?php

class SomeClass
{
    protected $data = [];

    public function __construct(array $data = [])
    {
        $this->data = $data;
    }

    public function getData()
    {
        return $this->data;
    }
}

$params = ['bar' => 'bar', 'baz' => 'baz'];
$someClass = new SomeClass($params);

echo $someClass->getData()['bar'] . PHP_EOL;

There is the magic method __set, but it is only called when attempting to write data to inaccessible properties:

<?php

class SomeClass
{
    protected $data = [];

    public function __construct(array $data = [])
    {
        $this->data = $data;
    }

    public function __set($name, $value)
    {
        $this->data[$name] = $value;
    }

    public function __get($name)
    {
        if(isset($this->data[$name])) {
            return $this->data[$name];
        }

        return null;
    }
}

$class = new SomeClass;
$class->bar = 'bar';
$class->baz = 'baz';

echo $class->bar . PHP_EOL . $class->baz . PHP_EOL;

If your class is starting to have a lot of parameters being passed in to the constructor, it may be a sign that your class is getting too big and trying to do too much. A refactoring may be in order.