国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel 中的一個后期靜態綁定

30e8336b8229 / 2578人閱讀

摘要:實驗一個抽象類,有個方法,通過延遲靜態綁定實例化并返回。這里如果把注釋打開,打印的就是重寫的值如果把抽象類改成普通類,改成的方式實例化,結果就不同了,打印的屬性都是各自類的屬性。

(原文地址,內容以原文為準,可能修改或者補充:https://blog.tanteng.me/2017/...)

關于 PHP 的 new static 延遲靜態綁定,或者叫后期靜態綁定,在 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;
}

位于 vendorlaravelframeworksrcIlluminateDatabaseEloquentModel.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 都是各自類的屬性。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25623.html

相關文章

  • LaravelLaravel 框架關鍵技術解析·讀書筆記(一)

    摘要:判斷是否存在構造函數,不存在直接實例化,存在則通過來獲取輸入函數,并有相應的方法解決依賴參數問題,實現依賴注入。 Laravel 框架關鍵技術解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數的添加 服務器實例化與服務注冊 路由加載 請求實例化與路由分發 相應生成與發送 其中,自動加載函數用于包含引用文件,改文件是composer...

    CocoaChina 評論0 收藏0
  • 三年前舊代碼的重構、總結與反思

    摘要:最近在維護一個三年前的舊代碼,用的是框架。單元測試和語言并發控制實際上是個蛋疼的問題,夸張一點說,當時的并不能特別輕松地實現并發,甚至不能實現并發。語言的功能之一就是自帶單元測試。用語言之前,我的習慣是不寫單元測試。 最近在維護一個三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個代碼算是比較標準為了實現在規定的時間內完成相關功能,同時程序員水平不高、經過大量優化之后,變...

    Shihira 評論0 收藏0
  • Laravel中的核心概念

    摘要:可以為服務提供者的方法設置類型提示。方法將在所有其他服務提供者均已注冊之后調用。所有服務提供者都在配置文件中注冊。可以選擇推遲服務提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應用程序的性能。 本文最早發布于 Rootrl的Blog 導言 Laravel是一款先進的現代化框架,里面有一些概念非常重要。在上手Laravel之前,我認為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...

    ddongjian0000 評論0 收藏0
  • Laravel思維導圖之Laravel核心概念

    摘要:的核心概念包括服務容器服務提供者門面契約。所有服務提供者都需要繼承類。可以為服務提供者的方法設置類型提示。方法將在所有其他服務提供者均已注冊之后調用。同樣會整理成思維導圖的形式以方便記憶與回顧。 showImg(https://segmentfault.com/img/remote/1460000010771201); Laravel 的核心概念包括:服務容器、服務提供者、門面(Fac...

    wthee 評論0 收藏0
  • Laravel 服務提供者和門面模式

    摘要:服務提供者先看看定義服務提供者是所有應用程序啟動的中心所在。通過本文,希望大家能夠了解服務提供者,,和實際調用的類的實例之間的關系。 以 Laravel 自帶的文件系統為例,在 config/app.php 的配置文件的 providers 數組中,注冊了一個服務提供者: IlluminateFilesystemFilesystemServiceProvider::class, 在 a...

    e10101 評論0 收藏0

發表評論

0條評論

30e8336b8229

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<