我想知道是否可以实现与C#的紧凑实例化语法类似的功能:
itemView.Question = new ItemViewQuestion()
{
AnswersJSON = itemView.Answer.ToJSONString(),
Modified = DateTime.Now,
ModifiedBy = User.Identity.Name
};
我希望能够创建一个任意类的对象来传递它们的属性,而不必为这些属性设置构造函数代码。
再举一个例子,可以使用stdClass
这样做:
(object) ["name" => "X", "age" => 30]
类型杂耍对自定义类不起作用。
答案 0 :(得分:3)
不幸的是,PHP本身没有这样的功能。
但是你可以在你的项目中创建一个类,并在你想要实例化的类中扩展它而不需要构造函数。像这样:
<?php
class Fillable{
public static function fill($props)
{
$cls = new static;
foreach($props as $key=>$value){
if (property_exists(static::class,$key)){
$cls->$key = $value;
}
}
return $cls;
}
}
class Vegetable extends Fillable
{
public $edible;
public $color;
}
$veg = Vegetable::fill([
'edible' => true,
'color' => 'green',
'name' => 'potato' //Will not get set as it's not a property of Vegetable. (you could also throw an error/warning here)
]);
var_dump($veg);
结帐this fiddle了解工作示例
答案 1 :(得分:0)
这在PHP中有效:
<?php
class Demo {
public function getA() {
return $this->Options['A'];
}
}
$D = new Demo();
$D->Options = Array(
'A' => '1',
'B' => '2',
'C' => '3'
);
var_dump($D->getA());
或者,像这样:
<?php
class Demo {
public function __construct($Options) {
$this->Options = $Options;
}
public function getA() {
return $this->Options['A'];
}
}
$D = new Demo(Array(
'A' => '1',
'B' => '2',
'C' => '3'
));
var_dump($D->getA());
甚至这个:
<?php
class Demo {
public function __construct($Options) {
foreach ($Options as $key=>$value) $this->$key = $value;
}
public function getA() {
return $this->A;
}
}
$D = new Demo(Array(
'A' => '1',
'B' => '2',
'C' => '3'
));
var_dump($D->getA());
我想这真的取决于你想要实现的目标?你说你不想使用魔法函数或设置器,但它还有更多吗?
答案 2 :(得分:0)
显然,php并没有这个。某处需要一个功能。我使用了一个非常接近的特征进行了实现。
<?php
Trait Init {
public function init($arr) {
$vars = get_object_vars($this);
foreach($arr as $k => $v) {
if ( array_key_exists($k, $vars) ) $this->$k = $v;
}
}
}
class Demo {
use Init;
public $answersJSON;
public $modified;
public $modifiedBy;
}
$obj = new Demo();
$obj->init(['modified' => 'now']);
print_r($obj);