Indirect modification of overloaded property

当你在使用 PHP 时遇到错误信息 Indirect modification of overloaded property app\model\slim\SlimWorkerArchiveModel::$review_log has no effect,这通常意味着你尝试通过引用修改一个被魔术方法(如 __get__set)重载的属性,但这种间接修改没有生效。

错误解释

  • 间接修改:这是指通过引用传递或数组操作等方式来修改对象属性。
  • 重载属性:如果你的类中定义了 __get__set 魔术方法,那么对属性的访问会被这些方法拦截。这意味着直接访问和修改属性实际上是在调用这些魔术方法。
  • 无效果:由于属性是通过魔术方法重载的,直接通过引用修改该属性不会改变实际的属性值。

常见原因

  1. 通过引用传递
   $model = new SlimWorkerArchiveModel();
   $log =& $model->review_log;  // 试图通过引用获取属性
   $log[] = 'New log entry';  // 这种方式不会修改 $model->review_log
  1. 通过数组操作
   $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

发表回复 0