我想知道Laravel如何實現雄辯的語法,使得第一where子句可以靜態地User::where()
雄辯第一where子句
User::where('id', 23)->where('email', $email)->first();
被稱爲他們有一個public static function where()
和public function where()
我想知道Laravel如何實現雄辯的語法,使得第一where子句可以靜態地User::where()
雄辯第一where子句
User::where('id', 23)->where('email', $email)->first();
被稱爲他們有一個public static function where()
和public function where()
在Eloquent模型上調用where
確實涉及幕後發生的一點魔法。首先,採取的例子:
User::where(’name’, ‘Joe’)->first;
還有,關於該User
類擴展Model
類不存在靜態where
方法。
發生什麼事情,是PHP魔術方法__callStatic
被調用,它試圖然後調用where
方法。
public static function __callStatic($method, $parameters)
{
$instance = new static;
return call_user_func_array([$instance, $method], $parameters);
}
既然沒有所謂的where
明確定義用戶的功能,則執行其在Model
定義的下一個魔術PHP方法__call
。
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return call_user_func_array([$this, $method], $parameters);
}
$query = $this->newQuery();
return call_user_func_array([$query, $method], $parameters);
}
常見的數據庫相關的方法,通過成爲訪問:
$query = $this->newQuery();
此實例化一個新的雄辯查詢生成器對象,它的這個對象的where
方法上運行。
所以,當你使用```用戶::其中()``你實際使用:
Illuminate\Database\Eloquent\Builder::where()
看看在Builder class看到所有的你共同雄辯方法習慣使用,像where()
,get()
,first()
,update()
等
Laracasts有很大深度(付費)視頻多麼激情的場面,我建議後面的作品。
那麼讓我們找到出。
當我們打開一個模型時,它擴展了Model
所以讓我們打開這個類。 在類Model
,我們發現2「神奇」的方法稱爲__call()
和__callStatic()
__call()
在對象範圍內調用方法不可訪問時被觸發。
__callStatic()
在調用靜態上下文中不可訪問的方法時被觸發。
我們也看到在Model
類是利用類use Illuminate\Database\Query\Builder as QueryBuilder;
的。如果我們打開Builder
類,我們找到一個名爲public function where()
方法所以,如果你User::where
它從Model
類調用__callStatic('where', $parameters)
。
我希望這是有道理的。
答案是[magic methods](http://www.php.net/manual/en/language.oop5.magic.php),具體是'__callStatic()'和'__call()' –