1

问题描述

thinkphp5 model源码里面 有的地方使用了(new static())->db() ,有的地方使用$this->db(true, false),使用new static()的地方可以换成$this吗,不理解

问题出现的环境背景及自己尝试过哪些方法

查找了一些资料也没查到为什么

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

public function __call($method, $args)
{
    $query = $this->db(true, false);
    if (method_exists($this, 'scope' . $method)) {
        // 动态调用命名范围
        $method = 'scope' . $method;
        array_unshift($args, $query);
        call_user_func_array([$this, $method], $args);
        return $this;
    } else {
        return call_user_func_array([$query, $method], $args);
    }
}

public static function __callStatic($method, $args)
{
    $model = new static();
    $query = $model->db();
    if (method_exists($model, 'scope' . $method)) {
        // 动态调用命名范围
        $method = 'scope' . $method;
        array_unshift($args, $query);

        call_user_func_array([$model, $method], $args);
        return $query;
    } else {
        return call_user_func_array([$query, $method], $args);
    }
}
/**
 * 删除记录
 * @access public
 * @param mixed $data 主键列表 支持闭包查询条件
 * @return integer 成功删除的记录数
 */
public static function destroy($data)
{
    $model = new static();
    $query = $model->db();
    if (empty($data) && 0 !== $data) {
        return 0;
    } elseif (is_array($data) && key($data) !== 0) {
        $query->where($data);
        $data = null;
    } elseif ($data instanceof \Closure) {
        call_user_func_array($data, [ & $query]);
        $data = null;
    }
    $resultSet = $query->select($data);
    $count     = 0;
    if ($resultSet) {
        foreach ($resultSet as $data) {
            $result = $data->delete();
            $count += $result;
        }
    }
    return $count;
}

你期待的结果是什么?实际看到的错误信息又是什么?

9月28日提问
1 个回答
0

已采纳

__call,__callStatic 这两个而言,前者是非静态方法,可以直接调用 $this 后者为静态方法,不能直接调用 $this , 当然也不排除在这里还有其他的用途。

destroy 方法而言,因为其第一个参数 $data 是作为 where 方法的条件来使用。如果有一个这样的代码,就会出现意外的结果。

// Order 是一个模型
$model = new Order;
// 这是一个订单
$order = $model->where('id',1)->find();

$model->destroy(['status'=>0]);

如你预想一般,$order 现在已经取到了 Order 对象 ,但是如果这时你调用 destroy ,如果没有 new static ,destroy 最终的条件就变成了。

$model->destroy([
    'id' => 1,
    'status' => 0,
])

因为在这个实例中,前面你调用过一个 id=1 的条件将会继续保持。

撰写答案

推广链接