我知道在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:对象只不过是一堆属性。
答案 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')
];