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

淺談Laravel中的一個(gè)后期靜態(tài)綁定

本篇文章主要介紹了淺談Laravel中的一個(gè)后期靜態(tài)綁定,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

關(guān)于 PHP  的 new static 延遲靜態(tài)綁定,或者叫后期靜態(tài)綁定,在 Laravel 中遇到一個(gè)使用上的問(wèn)題。如下,在 Laravel 中調(diào)用 Model 新增數(shù)據(jù)的時(shí)候,首先給 Model 加了一個(gè)獲取分表的方法:

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

從報(bào)錯(cuò)日志中發(fā)現(xiàn) $this->table 并沒(méi)有生效,但實(shí)際上在調(diào)用 create 方法之前打印表名的時(shí)候是期望的值,這里調(diào)用 create 方法為什么 $this->table 沒(méi)有被重置呢?

這里 $this->message 是一個(gè)繼承 Model 類(lèi)的模型類(lèi),其中 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.

因?yàn)?Laravel 框架的這個(gè) Model 類(lèi)是一個(gè) abstract 類(lèi)型,PHP 中 abstract 類(lèi)可以用 new static 后期靜態(tài)綁定的方式實(shí)例化,而 create 方法里 $model = new static($attributes) 實(shí)際上就是重新實(shí)例化了并返回,而調(diào)用者 Model 類(lèi)沒(méi)有定義 table 屬性,所以這個(gè)時(shí)候 $this->table 是沒(méi)有值的。

淺談Laravel中的一個(gè)后期靜態(tài)綁定

解決辦法是用 save 方法即可,如圖所示。實(shí)際上 create 方法也調(diào)用了 save 方法。

實(shí)驗(yàn)

一個(gè)抽象類(lèi) A,有個(gè) create 方法,通過(guò)延遲靜態(tài)綁定實(shí)例化并返回。B 類(lèi)繼承 A,test 方法中修改父類(lèi)的 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);

結(jié)果顯示 $obj1 和 $obj2 這兩個(gè)實(shí)例都是 B 的實(shí)例,調(diào)用 test 方法屬性 name 改變了,但是調(diào)用 create 方法后,name 屬性并沒(méi)有改變。 這也就是在本文中說(shuō)的在 Lavarel 中遇到的場(chǎng)景。 (這里如果把注釋打開(kāi),打印的 name 就是重寫(xiě)的值)

如果把抽象類(lèi) A 改成普通類(lèi),new static 改成 new self 的方式實(shí)例化,結(jié)果就不同了,打印的屬性 name 都是各自類(lèi)的屬性。

參考鏈接

PHP:后期靜態(tài)綁定

PHP中new self()和new static()的區(qū)別 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持。

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡(jiǎn)單分析了插值查找算法的概念、原理并結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)針對(duì)有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
下面小編就為大家分享一篇PHP實(shí)現(xiàn)APP微信支付的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實(shí)現(xiàn)無(wú)刷新文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開(kāi)發(fā)接口使用RSA進(jìn)行加密解密方法,對(duì)此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: av激情在线 | 91精品在线播放 | 欧美日韩一区二区在线播放 | 色婷婷一区二区三区四区 | 国产一区欧美一区 | 国产69久久精品成人看动漫 | 第四色影音先锋 | 久久久久亚洲精品国产 | av国产精品 | 蜜桃综合在线 | 国产成人精品午夜视频免费 | 人人99| 欧美成人在线免费 | 黄色片视频网站 | 亚洲区一区二 | 欧美成人精品 | 欧美亚洲国语精品一区二区 | 一二区成人影院电影网 | 国产自产c区 | 亚洲精品一区二区在线观看 | 亚洲免费视频一区 | 成人水多啪啪片 | 1000部精品久久久久久久久 | 国产在线观看一区二区三区 | 国产成人综合网 | 亚洲综合色丁香婷婷六月图片 | 黄色网址在线播放 | 欧美日韩久 | 日韩欧美在线一区 | 欧美一区二区大片 | 久久精品 | 国产成人精品亚洲日本在线观看 | 日本久久久久久久久 | 中文字幕黄色大片 | 中文精品一区二区 | h视频免费在线观看 | av激情在线| 国产精品自产拍在线观看蜜 | 成人在线观看网址 | 国产日韩亚洲欧美 | 日韩a v在线免费观看 |