PHP 中是否有像现在 C# 中那样的特殊对象初始值设定项构造?

问题描述 投票:0回答:5

我知道在 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:对象无非就是一堆属性。

php oop constructor initialization
5个回答
16
投票

从 PHP7 开始,我们有匿名类,它允许您在运行时扩展类,包括设置附加属性:

$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

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);
}

它还适用于从数据库行加载对象。因此得名。


1
投票

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

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')
];

0
投票

PHP 8 开始,我们现在有了构造函数属性升级

这个与命名参数一起让我们更接近 C# 中可用的对象初始值设定项。

例如,我们现在可以执行以下操作:

class MyObject
{
    public function __construct(
        public int $Property1,
        public int $Property2,
    ) {}
}

并像这样初始化一个新对象:

// PHP object initializer
$a = new MyObject(
    Property1: 1,
    Property2: 2
);

这为我们提供了与您引用的 C# 版本非常相似的语法,如下所示:

// c# object initializer
var a = new MyObject
{
    Property1 = 1,
    Property2 = 2
};
© www.soinside.com 2019 - 2024. All rights reserved.