亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

laravel框架模型中非靜態(tài)方法也能靜態(tài)調(diào)用的原理分析

 更新時(shí)間:2019年11月23日 10:18:22   作者:懷素真  
這篇文章主要介紹了laravel框架模型中非靜態(tài)方法也能靜態(tài)調(diào)用的原理,結(jié)合實(shí)例形式分析了laravel模型基類(lèi)中使用魔術(shù)方法實(shí)現(xiàn)非靜態(tài)方法進(jìn)行靜態(tài)調(diào)用的相關(guān)原理,需要的朋友可以參考下

本文實(shí)例講述了laravel框架模型中非靜態(tài)方法也能靜態(tài)調(diào)用的原理.分享給大家供大家參考,具體如下:

剛開(kāi)始用laravel模型時(shí),為了方便一直寫(xiě)靜態(tài)方法,進(jìn)行數(shù)據(jù)庫(kù)操作。

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
  public static function getList()
  {
    return self::get()->toArray();
  }
}

直到有朋友告訴可以不用這么寫(xiě),聲明一個(gè) protected 方法,方法中用 $this。在外部使用時(shí),也可以像調(diào)靜態(tài)函數(shù)一樣調(diào)用。

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
  protected function getList()
  {
    return $this->get()->toArray();
  }
}

試了一下,發(fā)現(xiàn)還真可以,按理說(shuō)受保護(hù)的 protected 非靜態(tài)方法,在外部是無(wú)法這么調(diào)用的 User::getList() 。

但是在 laravel 中就可以,查看了下 Model 基類(lèi)的代碼,原來(lái)是因?yàn)閷?shí)現(xiàn)了 __call() 和 __callStatic() 這兩個(gè)魔術(shù)方法。

class Model
{
  public function __call($method, $parameters)
  {
    if (in_array($method, ['increment', 'decrement'])) {
      return $this->$method(...$parameters);
    }
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
  }
  public static function __callStatic($method, $parameters)
  {
    return (new static)->$method(...$parameters);
  }
}

我們?cè)囍砸褜?shí)現(xiàn)下這兩個(gè)魔術(shù)方法,看看效果。

<?php
namespace App\Models;
class Model
{
  //在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)方法時(shí),__call()被調(diào)用
  public function __call($method, $parameters)
  {
    echo '__call()';
    return $this->{$method}(...$parameters);
  }
  //在靜態(tài)上下文中調(diào)用一個(gè)不可訪問(wèn)方法時(shí),__callStatic()被調(diào)用
  public static function __callStatic($method, $parameters)
  {
    echo '__callStatic()';
    //注意這里,通過(guò)延遲靜態(tài)綁定,仍然new了一個(gè)實(shí)例
    return (new static)->{$method}(...$parameters);
  }
  private function test()
  {
    echo '被調(diào)用了<br>';
  }
}

我們嘗試調(diào)用 test() 方法。

<?php
namespace App\Http\Controllers\Test;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Model;
class Test extends Controller
{
  public function index(Request $request)
  {
    //對(duì)象調(diào)用
    (new Model())->test();
    //靜態(tài)方法調(diào)用
    Model::test();
  }
}

結(jié)果顯示調(diào)用成功。

更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Laravel框架入門(mén)與進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • php 可變函數(shù)使用小結(jié)

    php 可變函數(shù)使用小結(jié)

    PHP 支持可變函數(shù)的概念。這意味著如果一個(gè)變量名后有圓括號(hào),PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它。本文重點(diǎn)給大家介紹php 可變函數(shù)使用小結(jié),感興趣的朋友一起看看吧
    2018-06-06
  • PHP date函數(shù)常用時(shí)間處理方法

    PHP date函數(shù)常用時(shí)間處理方法

    這篇文章主要介紹了PHP date函數(shù)常用時(shí)間處理方法,本文介紹獲取今天、明天、昨天、一周后、一個(gè)月前、一個(gè)月后等時(shí)間的方法,需要的朋友可以參考下
    2015-05-05
  • php實(shí)現(xiàn)JWT(json web token)鑒權(quán)實(shí)例詳解

    php實(shí)現(xiàn)JWT(json web token)鑒權(quán)實(shí)例詳解

    這篇文章主要介紹了php實(shí)現(xiàn)JWT(json web token)鑒權(quán)實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 分享10段PHP常用代碼

    分享10段PHP常用代碼

    本文匯集PHP開(kāi)發(fā)中經(jīng)常用到的時(shí)段代碼,包括Email、解壓縮、64位編碼、解析JSON等,對(duì)php常用代碼感興趣的朋友參考下
    2015-11-11
  • Yii框架結(jié)合sphinx,Ajax實(shí)現(xiàn)搜索分頁(yè)功能示例

    Yii框架結(jié)合sphinx,Ajax實(shí)現(xiàn)搜索分頁(yè)功能示例

    這篇文章主要介紹了Yii框架結(jié)合sphinx,Ajax實(shí)現(xiàn)搜索分頁(yè)功能,結(jié)合實(shí)例形式分析了Yii框架中使用sphinx與Ajax實(shí)現(xiàn)搜索結(jié)果的分頁(yè)展示效果,需要的朋友可以參考下
    2016-10-10
  • 淺析PHP 中move_uploaded_file 上傳中文文件名失敗

    淺析PHP 中move_uploaded_file 上傳中文文件名失敗

    這篇文章主要介紹了PHP 中move_uploaded_file 上傳中文文件名失敗的原因分析及解決方法 ,需要的朋友可以參考下
    2019-04-04
  • YII Framework框架教程之緩存用法詳解

    YII Framework框架教程之緩存用法詳解

    這篇文章主要介紹了YII Framework框架教程之緩存用法,結(jié)合實(shí)例形式詳細(xì)分析了Yii框架緩存的結(jié)構(gòu),原理,使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-03-03
  • 深入理解PHP類(lèi)的自動(dòng)載入機(jī)制

    深入理解PHP類(lèi)的自動(dòng)載入機(jī)制

    下面小編就為大家?guī)?lái)一篇深入理解PHP類(lèi)的自動(dòng)載入機(jī)制。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • 詳解PHP文件的自動(dòng)加載(autoloading)

    詳解PHP文件的自動(dòng)加載(autoloading)

    這篇文章主要介紹了詳解PHP文件的自動(dòng)加載(autoloading)相關(guān)知識(shí)點(diǎn)以及詳細(xì)用法,有這方面需要的朋友參考下吧。
    2018-02-02
  • 布隆過(guò)濾器(bloom filter)及php和redis實(shí)現(xiàn)布隆過(guò)濾器的方法

    布隆過(guò)濾器(bloom filter)及php和redis實(shí)現(xiàn)布隆過(guò)濾器的方法

    這篇文章主要介紹了布隆過(guò)濾器(bloom filter)介紹以及php和redis實(shí)現(xiàn)布隆過(guò)濾器實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論