第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

存儲庫模式:如何準確函數(shù)的簽名(返回類型)?

存儲庫模式:如何準確函數(shù)的簽名(返回類型)?

PHP
RISEBY 2023-08-19 16:35:03
我正在使用存儲庫模式從數(shù)據(jù)庫中獲取數(shù)據(jù)。這是我的基類:class BaseRepository implements EloquentRepositoryInterface{   protected $model;  public function __construct(Model $model)  {    $this->model = $model;  }    public function findOrFail($id): Model  {    try {      return $this->model->findOrFail($id);    } catch (\Exception $e) {      throw new \Exception($e);    }  }}它實現(xiàn)了這個接口:interface EloquentRepositoryInterface{  public function findOrFail($id): Model;}然后我有一個名為 的實體Item,它擴展了Model:class Item extends Model{  // ... }我想做的是創(chuàng)建一個 ItemRepositoryInterface:interface ItemRepositoryInterface extends EloquentRepositoryInterface{  public function findOrFail($id): Item;}但我無法更改接口簽名... PhpStorm 告訴我這是不兼容的,所以我必須public function findOrFail($id): Item從接口中刪除它。所以我$itemRepository->findOrFail()尊重 的簽名EloquentRepositoryInterface。這是我的 ItemRepository :class ItemRepository extends BaseRepository implements ItemRepositoryInterface{   // ...}問題是當我使用$itemRepository->findOrFail()規(guī)格時告訴我它返回Model我想要的是是當我打電話時$itemRepository->findOrFail()規(guī)格應該告訴我它正在返回Item有沒有辦法有這種行為?就像保留 EloquentRepositoryInterface 內(nèi)部的簽名findOrFail()并“覆蓋”它的返回類型,而不必重寫整個函數(shù)?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經(jīng)驗 獲得超8個贊

為什么要使用 BaseRepository?您的問題的解決方案是泛型,但據(jù)我所知 php 不支持泛型。您有 3 個選擇:您可以從返回類型的方法契約中刪除類型信息,或者跳過該 BaseRepository?;蛘吣愀静皇褂?eloquent 的存儲庫,因為 eloquent 使用 Active Record 模式,你的持久性將始終與你的模型綁定。因此,擁有一個額外的存儲庫層將所有內(nèi)容委托給模型看起來有點開銷,除非您想要抽象一些復雜的查詢。如果您仍然想使用存儲庫,請選擇第二個選項。


interface ItemRepository {

    public function findOrFail($id) : Item;

}


class EloquentItemRepository implements ItemRepository

{

    public function findOrFail($id) : Item {

        return Item::findOrFail($id);

    }

}


查看完整回答
反對 回復 2023-08-19
?
婷婷同學_

TA貢獻1844條經(jīng)驗 獲得超8個贊

我不相信你可以“覆蓋”/重寫 PHP 上接口方法的返回類型。關(guān)于返回類型的 php 文檔指出“繼承期間的返回類型是不變的”:

繼承期間聲明的返回類型的強制執(zhí)行是不變的;這意味著當子類型重寫父方法時,子類型的返回類型必須與父類型完全匹配,并且不能省略。如果父級未聲明返回類型,則允許子級聲明返回類型。

一種可能的解決方案是創(chuàng)建第二個具有不同名稱的方法,該方法ItemRepositoryInterface將調(diào)用并隱藏以下結(jié)果findOrFail

interface?ItemRepositoryInterface?extends?EloquentRepositoryInterface{
????public?function?findOrFailItem($id):?Item;
}


查看完整回答
反對 回復 2023-08-19
?
猛跑小豬

TA貢獻1858條經(jīng)驗 獲得超8個贊

EloquentRepository接口:

interface EloquentRepositoryInterface{
  public function findOrFail($id): ?Model;
}

語法 ?Model 將返回模型(如果存在)。對項目界面使用相同的方法


查看完整回答
反對 回復 2023-08-19
  • 3 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號