Topic:: 和 $topic-> 有区别么?

教程里的代码是使用 $topic->

public function index(Request $request, Topic $topic)
{
    $topics = $topic->withOrder($request->order)->paginate(20);
    return view('topics.index', compact('topics'));
}

我尝试用Topic:: 发现效果是一样的

public function index(Request $request)
{
    $topics = Topic::withOrder($request->order)->paginate(10);
    return view('topics.index', compact('topics'));
}

请问这两种方式有什么区别么?我原先以为Topic::是类似静态方法的概念,可在使用中发现是一样的

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

$topic 是遵循 隐式绑定 的写法。 也可以遵循个人喜好。代码实现上是没有区别的。

5年前 评论
讨论数量: 4

一个是调用普通方法,一个是调用静态方法,但是在topic model中没有withOrder这个方法,因此:

  • 如果使用$topic->withOrder,那么会调用\Illuminate\Database\Eloquent\Model::__call

    /**
    * Handle dynamic method calls into the model.
    *
    * @param  string  $method
    * @param  array  $parameters
    * @return mixed
    */
    public function __call($method, $parameters)
    {
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }
    
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
    }
  • 如果使用Topic::withOrder,那么会调用 \Illuminate\Database\Eloquent\Model::__callStatic,可以看到还是会去调用$topic->withOrder方法,就和上面是一样的了。因此二者效果么有区别。
    /**
    * Handle dynamic static method calls into the method.
    *
    * @param  string  $method
    * @param  array  $parameters
    * @return mixed
    */
    public static function __callStatic($method, $parameters)
    {
    return (new static)->$method(...$parameters);
    }
5年前 评论

$topic 是遵循 隐式绑定 的写法。 也可以遵循个人喜好。代码实现上是没有区别的。

5年前 评论

一个是调用普通方法,一个是调用静态方法,但是在topic model中没有withOrder这个方法,因此:

  • 如果使用$topic->withOrder,那么会调用\Illuminate\Database\Eloquent\Model::__call

    /**
    * Handle dynamic method calls into the model.
    *
    * @param  string  $method
    * @param  array  $parameters
    * @return mixed
    */
    public function __call($method, $parameters)
    {
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }
    
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
    }
  • 如果使用Topic::withOrder,那么会调用 \Illuminate\Database\Eloquent\Model::__callStatic,可以看到还是会去调用$topic->withOrder方法,就和上面是一样的了。因此二者效果么有区别。
    /**
    * Handle dynamic static method calls into the method.
    *
    * @param  string  $method
    * @param  array  $parameters
    * @return mixed
    */
    public static function __callStatic($method, $parameters)
    {
    return (new static)->$method(...$parameters);
    }
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!