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::是类似静态方法的概念,可在使用中发现是一样的

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

$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年前 评论

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