Laravel中一個後期靜態綁定詳細說明

小云云
發布: 2023-03-19 17:32:02
原創
1949 人瀏覽過

關於 PHP 的 new static 延遲靜態綁定,或稱為後期靜態綁定,在 Laravel 遇到一個使用上的問題。本文主要介紹了淺談Laravel中的一個後期靜態綁定,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

如下,在Laravel 中呼叫Model 新增資料的時候,先為Model 加了一個取得分錶的方法:


protected function addToMessage($msgType, $userID, $commentID, $replyCommentID, $replyUserID, $gameID) { if (!$userID) { return false; } $table = 't_message_' . hashID($userID, 100); $this->message->setTable($table)->create([ 'msg_type' => $msgType, 'user_id' => $userID, 'comment_id' => $commentID, 'reply_comment_id' => $replyCommentID, 'reply_user_id' => $replyUserID, 'game_id' => $gameID, 'is_read' => 0, 'created_at' => date('Y-m-d H:i:s'), ]); return true; }
登入後複製

這裡setTable 方法是在Model 裡定義的取得分錶的方法:


public function setTable($table) { $this->table = $table; return $this; }
登入後複製

從報錯日誌發現$this->table 並沒有生效,但實際上在呼叫create 方法之前印表名的時候是期望的值,這裡呼叫create 方法為什麼$this->table 沒有被重置呢?

這裡$this->message 是繼承Model 類別的模型類,其中create 方法:


public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
登入後複製

位於vendor\laravel\framework\src \Illuminate\Database\Eloquent\Model.php Line 557.

因為Laravel 框架的這個Model 類別是一個abstract 類型,PHP 中abstract 類別可以用new static 後期靜態綁定的方式實例化,而create方法裡$model = new static($attributes) 實際上就是重新實例化了並返回,而呼叫者Model 類別沒有定義table 屬性,所以這個時候$this->table 是沒有值的。

解決方法是用 save 方法即可,如圖所示。實際上 create 方法也呼叫了 save 方法。

實驗

一個抽象類別 A,有個 create 方法,透過延遲靜態綁定實例化並傳回。 B 類別繼承 A,test 方法中修改父類別的 name 屬性。


name = "Tony Tan"; return $this; } } $obj1 = (new B)->test(); $obj2 = (new B)->test()->create(); var_dump($obj1); var_dump($obj2);
登入後複製

結果顯示$obj1 和$obj2 這兩個實例都是B 的實例,呼叫test 方法屬性name 改變了,但是呼叫create 方法後,name 屬性並沒有改變。 這也就是本文所說的在 Lavarel 中遇到的場景。 (這裡如果把註解打開,印出來的name 就是重寫的值)

如果把抽象類別A 改成普通類,new static 改成new self 的方式實例化,結果就不同了,印出來的屬性name 都是各自類別的屬性。

相關推薦:

php後靜態綁定的定義與使用方法實例詳解

php延遲靜態綁定是什麼?延遲靜態綁定實例程式碼詳解

PHP Static延遲靜態綁定用法分析

以上是Laravel中一個後期靜態綁定詳細說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!