PHP对象,设置多个属性

时间:2012-05-03 15:46:13

标签: php oop object

是否可以在php中为对象一次设置多个属性? 而不是做:

$object->prop1 = $something;
$object->prop2 = $otherthing;
$object->prop3 = $morethings;

做类似的事情:

$object = (object) array(
    'prop1' => $something,
    'prop2' => $otherthing,
    'prop3' => $morethings
);

没有覆盖对象

7 个答案:

答案 0 :(得分:16)

不喜欢你想要的方式。但这可以通过循环来完成。

$map =  array(
    'prop1' => $something,
    'prop2' => $otherthing,
    'prop3' => $morethings
);

foreach($map as $k => $v)
    $object->$k = $v;

仅查看2条额外的行。

答案 1 :(得分:8)

你应该看看Object Oriented PHP Best Practices

“由于setter函数返回$ this,你可以将它们链接起来:”

 $object->setName('Bob')
        ->setHairColor('green')
        ->setAddress('someplace');

这恰好被称为fluent interface

答案 2 :(得分:3)

我建议你不要这样做。说真的,

你的代码在第一种方式上更加清晰,你的意图更加清晰,并且你并没有把你的代码放在某种程度上,以至于将来某个人会看到你的代码并想到“这个白痴到底是什么”思考“?

如果你坚持做一些明显错误的事情,你总是可以创建一个数组,迭代它并在循环中设置所有属性。我不会给你代码。这是邪恶的。

答案 3 :(得分:2)

您可以为返回对象的对象编写一些setter:

public function setSomething($something)
{
 $this->something = $something;
 return $this; //this will return the current object
}

然后你可以这样做:

$object->setSomething("something")
       ->setSomethingelse("somethingelse")
       ->setMoreThings("some more things");

您需要为每个属性编写一个setter,因为__set函数无法返回值。

或者,设置单个函数以接受property =>的数组。价值并设置一切?

public function setProperties($array)
{
  foreach($array as $property => $value)
  {
    $this->{$property} = $value;
  }
  return $this;
}

并传入数组:

$object->setProperties(array('something' => 'someText', 'somethingElse' => 'more text', 'moreThings'=>'a lot more text'));

答案 4 :(得分:0)

我实际上不会这样做......但为了好玩,我会

$object = (object) ($props + (array) $object);

你最终得到一个由$ objects公共属性组成的stdClass,所以它失去了它的类型。

答案 5 :(得分:0)

方法objectThis()将类数组属性或数组转换为stdClass。使用direct transtypage(object)将删除数字索引,但使用此方法将保留数字索引。

public function objectThis($array = null) {
    if (!$array) {
        foreach ($this as $property_name => $property_values) {
            if (is_array($property_values) && !empty($property_values)) {
                $this->{$property_name} = $this->objectThis($property_values);
            } else if (is_array($property_values) && empty($property_values)) {
                $this->{$property_name} = new stdClass();
            }
        }
    } else {
        $object = new stdClass();
        foreach ($array as $index => $values) {
            if (is_array($values) && empty($values)) {
                $object->{$index} = new stdClass();
            } else if (is_array($values)) {
                $object->{$index} = $this->objectThis($values);
            } else if (is_object($values)) {
                $object->{$index} = $this->objectThis($values);
            } else {
                $object->{$index} = $values;
            }
        }
        return $object;
    }
}

答案 6 :(得分:0)

我意识到这是一个古老的问题,但为了其他人的利益,我最近自己解决了这个问题,并想分享结果

<?php
    //Just some setup
    header('Content-Type: text/plain');
    $account = (object) array(
        'email' => 'foo',
        'dob'=>((object)array(
            'day'=>1,
            'month'=>1,
            'year'=>((object)array('century'=>1900,'decade'=>0))
        ))
    );
    var_dump($account);
    echo "\n\n==============\n\n";

    //The functions
    function &getObjRef(&$obj,$prop) {
        return $obj->{$prop};
    }

    function updateObjFromArray(&$obj,$array){
        foreach ($array as $key=>$value) {
            if(!is_array($value))
                $obj->{$key} = $value;
            else{
                $ref = getObjRef($obj,$key);
                updateObjFromArray($ref,$value);
            }
        }
    }

    //Test
    updateObjFromArray($account,array(
        'id' => '123',
        'email' => 'user@domain.com',
        'dob'=>array(
            'day'=>19,
            'month'=>11,
            'year'=>array('century'=>1900,'decade'=>80)
        )
    ));
    var_dump($account);

显然没有内置的安全措施。主要的警告是updateObjFromArray函数假定对于$array中的任何嵌套数组,$obj中的相应密钥已经存在并且是对象,这必须是真的,或者像对象一样处理它会引发错误。

希望这有帮助! :)