有没有一种简便的方法来设置多个对象属性?

4
因为我很懒,所以想知道PHP是否有一种简写的方式来设置属性,例如...
with $person_object {
    ->first_name = 'John';
    ->last_name = 'Smith';
    ->email = 'spam_me@this-place.com';
}

有类似的东西吗?或者,是否有一种简单的方法可以设置属性而不必一遍又一遍地输入 $person_object


你可以制作一个通用的装饰器函数。 - zzzzBov
5个回答

8
您可以在您的Person类中实现类似于构建者模式的东西。这种方法包括在每个setter调用结束时返回$this
$person
    ->set_first_name('John')
    ->set_last_name('Smith')
    ->set_email('spam_me@this-place.com');

And in your class...

class Person {
    private $first_name;
    ...
    public function set_first_name($first_name) {
        $this->first_name = $first_name;
        return $this;
    }
    ...
}

1
这是一个糟糕的黑客。不要滥用模式以实现速记! - Pacerier

3

没有。

没有,真的没有。


2
一个通用的装饰函数可以为您完成这个操作:
function decorate( $object, $data )
{
  foreach ( $data as $key => $value )
  {
    $object->$key = $value;
  }
}

decorate( $person_object, array( 'first_name' => 'John', 'last_name' => 'Smith' ) );

我可能犯了一些错误,因为我很久没有写PHP代码了,而且这个代码没有经过测试。


1

不,我不这么认为。但是你可以制作这样的东西:

class Person {

function __call($method, $args) {
    if (substr($method, 0, 3) == set) {
        $var = substr($method, 3, strlen($method)-3);
        $this->$var = $args[0];
    } else {
        //throw exception
    }
}

}

0

在处理数组而不是对象时,您可以从技术上使用 compact(),但由于它使用字符串来查找变量名称,因此它没有 ES2015 JavaScript 中简写属性名称的工作方式那样可靠。您可以将数组转换为 stdObject,但当您需要对象为特定类型时,这并不是很有用。在 PHP 中似乎没有办法使用对象实现您要寻求的功能,因为它会破坏封装性; 另一方面,JavaScript 公开了所有对象状态。

旁注:文档中指出compact()extract()的相反操作,可以考虑使用它来模拟数组的对象解构。然而,使用extract()时,传入的数组几乎可以自由访问符号表,所以我不建议使用它;在PHP 7.3及更高版本中,我建议使用数组解构代替)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接