【发布时间】:2023-04-01 16:19:01
【问题描述】:
假设我有这些课程:
abstract class AbstractEntity {
function __construct($args = array()) {
foreach ($args as $property => $value) {
$this->{$property} = $value;
}
}
public function __get( $property ) {
if( isset( $this->{$property} ) ) {
return $this->{$property};
} else {
throw new \Exception( 'Porperty ' . $property . ' not found!' );
}
}
public function __set($property, $value) {
if( isset( $this->{$property} ) ) {
$this->{$property} = $value;
} else {
throw new \Exception( 'Porperty ' . $property . ' not found!' );
}
}
}
class Person extends AbstractEntity {
protected $name;
}
class Group extends AbstractEntity {
protected $people; // array of Person
}
现在我想在循环中使用Person 对象填充$people 属性,例如:
$group = new Group( array( 'people' => array() ) );
foreach ( get_people_data() as $person_data ) {
$group->people[] = new Person( $person_data['name'] );
}
但这不起作用,我得到一个错误:
Notice: Indirect modification of overloaded property Group::$people has no effect in ...
我知道我可以使用临时数组,用Person 对象填充它,然后将其分配给$people 属性,但我有点不喜欢它......那么,还有其他解决方案吗?
【问题讨论】:
-
发布更多
class Group。它是否实现了魔术__get()?它应该是隐含的,但如果你声明public $people = array();有什么改变吗? (我不希望它) -
@MichaelBerkowski,查看编辑后的代码,我试图总结,但我摆脱了重要的部分......
-
阅读property visibility。你没有声明,但属性应该是
public。 -
@MichaelBerkowski,我的实际上受到保护,将它们公开是一种好习惯吗?我一直被告知这不是……或者那只发生在 Java 中??
-
好吧,如果他们是
protected,你就不能在课堂之外(比如在你的循环中)访问它们,这就是你问题的根源。如果您需要在课堂外附加到$group->people[],它们需要是公开的
标签: php arrays object properties