当你在使用 PHP 时遇到错误信息 Indirect modification of overloaded property app\model\slim\SlimWorkerArchiveModel::$review_log has no effect
,这通常意味着你尝试通过引用修改一个被魔术方法(如 __get
和 __set
)重载的属性,但这种间接修改没有生效。
错误解释
- 间接修改:这是指通过引用传递或数组操作等方式来修改对象属性。
- 重载属性:如果你的类中定义了
__get
或__set
魔术方法,那么对属性的访问会被这些方法拦截。这意味着直接访问和修改属性实际上是在调用这些魔术方法。 - 无效果:由于属性是通过魔术方法重载的,直接通过引用修改该属性不会改变实际的属性值。
常见原因
- 通过引用传递:
$model = new SlimWorkerArchiveModel();
$log =& $model->review_log; // 试图通过引用获取属性
$log[] = 'New log entry'; // 这种方式不会修改 $model->review_log
- 通过数组操作:
$model = new SlimWorkerArchiveModel();
$model->review_log[] = 'New log entry'; // 这种方式也不会修改 $model->review_log
解决方法
要解决这个问题,你需要确保在修改属性时直接调用 __set
方法,或者在你的类中实现适当的逻辑来处理这种情况。
方法一:直接使用 __set
方法
$model = new SlimWorkerArchiveModel();
$model->review_log = array_merge($model->review_log, ['New log entry']);
方法二:在类中实现适当的方法
你可以在类中添加一个方法来处理特定的修改逻辑:
class SlimWorkerArchiveModel {
private $data = [];
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : null;
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
public function addReviewLog($entry) {
if (isset($this->data['review_log']) && is_array($this->data['review_log'])) {
$this->data['review_log'][] = $entry;
} else {
$this->data['review_log'] = [$entry];
}
}
}
// 使用示例
$model = new SlimWorkerArchiveModel();
$model->addReviewLog('New log entry');
方法三:修改 __set
方法以支持数组追加
你也可以修改 __set
方法,使其能够处理数组追加的情况:
class SlimWorkerArchiveModel {
private $data = [];
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : null;
}
public function __set($name, $value) {
if (is_array($value) && isset($this->data[$name]) && is_array($this->data[$name])) {
$this->data[$name] = array_merge($this->data[$name], $value);
} else {
$this->data[$name] = $value;
}
}
}
// 使用示例
$model = new SlimWorkerArchiveModel();
$model->review_log = ['Initial log entry'];
$model->review_log[] = 'New log entry'; // 现在这种方式会生效
通过上述方法之一,你可以确保在修改重载属性时能够正确地更新属性值。选择哪种方法取决于你的具体需求和代码结构。
Was this helpful?
0 / 0