我知道在 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:对象无非就是一堆属性。
从 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
我建议你使用构造函数并在初始化对象时设置你想要的变量。
我也从 C# 转向 PHP,所以我在 PHP 中得到了这个:
$this->candycane = new CandyCane(['Flavor' => 'Peppermint', 'Size' => 'Large']);
我的对象有一个基类,用于检查是否有一个参数以及它是否是一个数组。如果是这样,它称之为:
public function LoadFromRow($row){
foreach ($row as $columnname=>$columnvalue)
$this->__set($columnname, $columnvalue);
}
它还适用于从数据库行加载对象。因此得名。
另一种方法,这不是正确的方法,但在某些情况下还可以:
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')
];
这个与命名参数一起让我们更接近 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
};