請問laravel 在類別的建構方法裡面依賴注入__construct(User $user)然後後面的方法都直接用$this->user 調用,跟直接使用User::find()有什麼區別?比較推薦哪一種?
請問laravel 在類別的建構方法裡面依賴注入__construct(User $user)然後後面的方法都直接用$this->user 調用,跟直接使用User::find()有什麼區別?比較推薦哪一種?
這是php類別的靜態方法和動態方法的差別。
靜態方法不需要類別實例化就能直接透過class::function
使用,但在宣告的時候必須要有static
關鍵字。
而動態方法則必須透過類別的實例化才能呼叫。
<code class="php">$class= new Class; $class->somefunc();</code>
兩種方法並沒有孰優孰劣,關鍵看用到的場景。
一般情況下,如果並不是邏輯關聯性十分緊密,則建議使用靜態方法。因為動態方法其實需要隱性的傳入一個參數:$this
,對效能略有影響。
不懂php,不過在「依賴接口,而非依賴實作」在程式設計領域是個基本的想法。
但介面不是實際的對象,如何呼叫呢,這就需要注入,我們可以把所有註入在物理上集中到一個地方。這樣當想修改一個類別的實作時,只要修改一個地方就好了。
<code>Class A{ function __construct(User $user){ } } Class B{ function __construct(){ $user = User::find(['id'=>1]); } } $user = User::find(['id'=>1]); $a = new A($user); $b = new B(); </code>
如果以後有業務上的改動,使用
GoodUser extends User {}
程式碼需要更改
<code>Class B{ function __construct(){ $user = GoodUser::find(['id'=>1]); } } $user = GoodUser::find(['id'=>1]); $a = new A($user); $b = new B(); </code>
有沒有發現,類B被更改了。 ! ! !
也就是違反了開放封閉原則。
大致是這樣~嘻嘻