有没有一种速记方法来设置许多对象属性


Is there a shorthand way to set many object properties?

因为我很懒,我想知道 PHP 是否有这样的速记方法来设置这样的属性......

with $person_object {
    ->first_name = 'John';
    ->last_name = 'Smith';
    ->email = 'spam_me@this-place.com';
}

有这样的事情吗?或者,是否有一种懒惰的方法可以设置属性而无需一遍又一遍地键入$person_object

您可以在

Person类中实现类似于构建器模式的东西。该方法涉及在每次二传手调用结束时返回$this

$person
    ->set_first_name('John')
    ->set_last_name('Smith')
    ->set_email('spam_me@this-place.com');

在你的课堂上...

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

No.

不,没有。

一个通用的装饰函数可以为你做到这一点:

function decorate( $object, $data )
{
  foreach ( $data as $key => $value )
  {
    $object->$key = $value;
  }
}
decorate( $person_object, array( 'first_name' => 'John', 'last_name' => 'Smith' ) );

可能犯了一些错误,自从我编写PHP代码以来已经有一段时间了,这是未经测试的

不,我不这么认为。但是,您可以制作这样的事情:

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
    }
}
}

当使用数组而不是对象时,从技术上讲,您可以使用compact(),但由于它使用字符串来查找变量名称,因此它不像 ES2015 JavaScript 中的速记属性名称那样万无一失。您可以将数组转换为stdObject但当您需要对象为特定类型时,这并不那么有用。似乎没有一种方法可以对 PHP 中的对象执行您所寻求的操作,因为它会破坏封装;JavaScript,OTOH,公开公开所有对象状态。

旁注:文档指出,compact()extract()相反 - 可以考虑使用它来模拟数组的对象解构。但是,随着extract()传入数组几乎可以自由支配符号表,所以我不建议使用它;在 PHP 7.3 及更高版本中,我建议改用数组解构(。