因为我很懒,我想知道 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 及更高版本中,我建议改用数组解构(。