欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

直到有朋友告訴可以不用這么寫,聲明一個 protected 方法,方法中用 $this。在外部使用時,也可以像調(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)還真可以,按理說受保護的 protected 非靜態(tài)方法,在外部是無法這么調(diào)用的 User::getList() 。

但是在 laravel 中就可以,查看了下 Model 基類的代碼,原來是因為實現(xiàn)了 __call() 和 __callStatic() 這兩個魔術(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);
  }
}

我們試著自已實現(xiàn)下這兩個魔術(shù)方法,看看效果。

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    分享10段PHP常用代碼

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

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

    這篇文章主要介紹了Yii框架結(jié)合sphinx,Ajax實現(xiàn)搜索分頁功能,結(jié)合實例形式分析了Yii框架中使用sphinx與Ajax實現(xiàn)搜索結(jié)果的分頁展示效果,需要的朋友可以參考下
    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é)合實例形式詳細分析了Yii框架緩存的結(jié)構(gòu),原理,使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-03-03
  • 深入理解PHP類的自動載入機制

    深入理解PHP類的自動載入機制

    下面小編就為大家?guī)硪黄钊肜斫釶HP類的自動載入機制。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 詳解PHP文件的自動加載(autoloading)

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

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

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

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

最新評論