在PHP中是否有一个特殊的对象初始化器构造,就像现在在C#中一样?

时间:2010-10-01 09:26:29

标签: php oop constructor initialization

我知道在C#中你现在可以这样做:

var a = new MyObject
{
    Property1 = 1,
    Property2 = 2
};

PHP中也有类似的东西吗?或者我应该通过构造函数还是通过多个语句来完成它;

$a = new MyObject(1, 2);

$a = new MyObject();
$a->property1 = 1;
$a->property2 = 2;

如果可能,但每个人都认为这是一个糟糕的主意,我也想知道。

PS:对象只不过是一堆属性。

4 个答案:

答案 0 :(得分:14)

从PHP7开始,我们有Anonymous Classes,它允许您在运行时扩展一个类,包括设置其他属性:

$a = new class() extends MyObject {
    public $property1 = 1;
    public $property2 = 2;
};

echo $a->property1; // prints 1

在PHP7之前,没有这样的事情。如果想要实例化具有任意属性的对象,则可以执行

public function __construct(array $properties)
{
    foreach ($properties as $property => $value) 
    {
        $this->$property = $value
    }
}

$foo = new Foo(array('prop1' => 1, 'prop2' => 2));

根据需要添加变体。例如,将检查添加到property_exists以仅允许设置已定义的成员。我发现在设计缺陷的对象上抛出随机属性。

如果您不需要特定的类实例,但只需要一个随机对象包,您也可以这样做

$a = (object) [
    'property1' => 1,
    'property2' => 2
];

然后会为您提供StdClass的实例,您可以将其作为

进行访问
echo $a->property1; // prints 1

答案 1 :(得分:2)

我建议你使用构造函数并在初始化对象时设置你想要的变量。

答案 2 :(得分:2)

我也从c#转到PHP,所以我在PHP中使用它:

$this->candycane = new CandyCane(['Flavor' => 'Peppermint', 'Size' => 'Large']);

我的对象有一个基类,它检查是否有一个参数,如果它是一个数组。如果是这样,它会调用:

public function LoadFromRow($row){
    foreach ($row as $columnname=>$columnvalue)
        $this->__set($columnname, $columnvalue);
}

它也适用于从数据库行加载对象。因此这个名字。

答案 3 :(得分:0)

另一种方法,这不是正确的方法,但在某些情况下还可以:

class Dog
{
    private $name;
    private $age;

    public function setAge($age) {
        $this->age = $age;
        return $this;
    }

    public function getAge() {
        return $this->age;
    }

    public function setName($name) {
        $this->name = $name;
        return $this;
    }

    public function getName() {
        return $this->name;
    }
}

$dogs = [
    1 => (new Dog())->setAge(2)->setName('Max'),
    2 => (new Dog())->setAge(7)->setName('Woofer')
];