coding時候思惟定式,就寫出了這樣的代碼php
$model = xxxModel::class; $model::from($model::getTable() . ' as ' . $tableAlia);
運行錯誤提示: getTable 是non-static 不能夠靜態調用;ui
因而 想起 this
一 : Model::where() 是ok的code
二: Eloquent\Model 類是有__callStatic的rem
沒細想就搜了網上,因而 有人問了這個問題 可是網上搬出來的是 鳥哥的關於 靜態方法的判斷不是根據 ::符號,而是根據調用的上下文--calling scope .get
可是提問隨後拋出 where 爲什麼正常;io
==============table
理解:function
若是該類存在同名方法,可是未聲明爲 static, 則運行階段會根據這個狀況拋錯;class
若是該類不存在該同名方法,則嘗試走 __callStatic ;
==========================
Model::where() 實際走的是本身的__callStatic,
public static function __callStatic($method, $parameters) { return (new static)->$method(...$parameters); }
============================
由於Model類內部不存在where方法,因此又走了 __call
public function __call($method, $parameters) { if (in_array($method, ['increment', 'decrement'])) { return $this->$method(...$parameters); } //$this->newQuery() 實例化 \Illuminate\Database\Eloquent\Builder類 return $this->newQuery()->$method(...$parameters); }
因此 where 實際是調用的 Eloquent\Builder 的where 方法;而 getTable gg