在构造函数调用时设置对象属性(PHP)

时间:2018-02-02 13:41:12

标签: php

我想知道是否可以实现与C#的紧凑实例化语法类似的功能:

itemView.Question = new ItemViewQuestion()
{
  AnswersJSON = itemView.Answer.ToJSONString(),
  Modified = DateTime.Now,
  ModifiedBy = User.Identity.Name
};

我希望能够创建一个任意类的对象来传递它们的属性,而不必为这些属性设置构造函数代码。

再举一个例子,可以使用stdClass这样做:

(object) ["name" => "X", "age" => 30]

类型杂耍对自定义类不起作用。

3 个答案:

答案 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);