我有一个公共属性主要是数组的对象。我写了以下两个函数:
public function updateProperty($property, $key, $value) {
if ($key!=null) $this->$property[$key]=$value;
else $this->$property=$value;
}
public function getProperty($property, $key=null) {
if ($key!=null) return $this->$property[$key];
else return $data;
}
当我尝试使用这些功能时,我总是收到以下警告:
警告:非法字符串偏移'id'
如果我将getProperty函数更改为以下版本,那么一切正常,但我也无法弄清楚如何更改updateProperty。为什么我会收到此警告?
public function getProperty($property, $key=null) {
$data=$this->$property;
if ($key!=null) return $data[$key];
else return $data;
}
答案 0 :(得分:1)
假设您有一个类属性$datafields
,并且您将方法调用为$class->getProperty('datafields','firstData');
,那么您需要一个如您所示的变量属性,但是因为访问它需要{}
消除歧义使用索引的数组:
return $this->{$property}[$key];
和
$this->{$property}[$key] = $value;
答案 1 :(得分:0)
public function updateProperty($property, $key, $value) {
if ($key!=null) $this->$property[$key]=$value;
else $this->$property=$value;
}
此处,$value
是您要为$key
数组$property
分配的新值。
不确定为什么要这样做,但当您说:else $this->$property = $value
时,您将$property
引用为值,而不是array
。所以在此之后$property
不再是一个数组。
假设您多次调用此方法,一旦$property
丢失了它作为数组的位置并变为纯粹值,它将尝试在后续调用中更新$property[$key]
。这可能是它抱怨非法抵消的原因。
我只是想知道你是否可以这样做:
public function updateProperty($property, $key, $value) {
if ($key!=null)
$this->$property[$key]=$value;
}