亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

PHP
RISEBY 2023-08-19 16:35:03
我正在使用存儲庫模式從數據庫中獲取數據。這是我的基類: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);    }  }}它實現了這個接口:interface EloquentRepositoryInterface{  public function findOrFail($id): Model;}然后我有一個名為 的實體Item,它擴展了Model:class Item extends Model{  // ... }我想做的是創建一個 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()規格時告訴我它返回Model我想要的是是當我打電話時$itemRepository->findOrFail()規格應該告訴我它正在返回Item有沒有辦法有這種行為?就像保留 EloquentRepositoryInterface 內部的簽名findOrFail()并“覆蓋”它的返回類型,而不必重寫整個函數?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

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


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條經驗 獲得超8個贊

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

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

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

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


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

TA貢獻1858條經驗 獲得超8個贊

EloquentRepository接口:

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

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


查看完整回答
反對 回復 2023-08-19
  • 3 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號