久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

淺談Laravel中的一個后期靜態綁定

本篇文章主要介紹了淺談Laravel中的一個后期靜態綁定,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

關于 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;
}

位于 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 是沒有值的。

淺談Laravel中的一個后期靜態綁定

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

實驗

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

<?php
 
abstract class A
{
  protected $name = "tanteng";
 
  public static function create()
  {
    return new static();
  }
}
 
class B extends A
{
  //protected $name = '紙牌屋弗蘭克';
 
  public function test()
  {
    $this->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中new self()和new static()的區別 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 激情婷婷成人 | 国产精品精品视频 | 成人免费高清 | 亚洲成av人片在线观看无码 | 国产成人免费视频网站视频社区 | 成人av在线播放 | 黄一级| 精品欧美激情精品一区 | 欧美女优在线观看 | 日韩欧美一区二区三区在线播放 | 乱码av午夜噜噜噜噜动漫 | 日韩精品一区二区三区中文字幕 | 成人永久免费 | 在线91| 国产极品车模吞精高潮呻吟 | 国产乱码精品1区2区3区 | 81精品国产乱码久久久久久 | 国产乱码精品1区2区3区 | sese视频在线观看 | 亚洲国产欧美91 | 在线看亚洲 | 超黄毛片 | 国产福利在线小视频 | ririsao久久精品一区 | 国产精品视频一区二区三区不卡 | 国产ts人妖另类 | 精品少妇一区二区三区在线播放 | 福利视频三区 | 久久精品国产一区二区三区 | 欧美日高清视频 | 最近最新中文字幕 | 日韩午夜网站 | 91看片在线观看 | 亚洲精久久 | 欧美日韩一区二区视频在线观看 | 中文字幕av一区 | 亚洲免费毛片 | 国产成人精品综合 | 色黄视频在线 | 国产精品无码久久久久 | 国内91在线|