3 回答

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

TA貢獻1844條經驗 獲得超8個贊
我不相信你可以“覆蓋”/重寫 PHP 上接口方法的返回類型。關于返回類型的 php 文檔指出“繼承期間的返回類型是不變的”:
繼承期間聲明的返回類型的強制執行是不變的;這意味著當子類型重寫父方法時,子類型的返回類型必須與父類型完全匹配,并且不能省略。如果父級未聲明返回類型,則允許子級聲明返回類型。
一種可能的解決方案是創建第二個具有不同名稱的方法,該方法ItemRepositoryInterface
將調用并隱藏以下結果findOrFail
:
interface?ItemRepositoryInterface?extends?EloquentRepositoryInterface{ ????public?function?findOrFailItem($id):?Item; }

TA貢獻1858條經驗 獲得超8個贊
EloquentRepository接口:
interface EloquentRepositoryInterface{ public function findOrFail($id): ?Model; }
語法 ?Model 將返回模型(如果存在)。對項目界面使用相同的方法
- 3 回答
- 0 關注
- 172 瀏覽
添加回答
舉報