我正在研究一個簡單的ORM解決方案,並遇到棘手的情況。理想情況下,我希望能夠在靜態上下文和對象上下文中使用方法,具體取決於它如何被調用。我不知道這是可能的,但這裏是我的意思是:靜態/非靜態方法問題
假設一個用戶模式要調用其中()靜態,這目前工作正常,例如:
$user = User::where('id = ?', 3);
現在,我也支持關係,例如用戶可以擁有消息。當建立這種關係時,我只需在用戶模型中存儲消息模型的空白副本並設置一個外鍵。例如:
$user -> messages = new Message();
$user -> messages -> foreign_key = 'user_id';
現在,理想情況下,我想能夠調用:
$user -> messages -> where('unread = ?', 1);
在非靜態上下文,並利用$如此 - > foreign_key時在這方面如此至於只拉外鍵與用戶的id相匹配的消息。這種類型的上下文切換可能在PHP中?任何從靜態上下文引用$ this都會拋出一個錯誤作爲其靜態方法,並且不應該依賴$ this(由於顯而易見的原因,當從靜態上下文中調用時,$ this將不存在)
是否有任何聰明的方法呢?我嘗試了重載方法來獲得兩個不同的原型,它們都帶有和不帶static關鍵字,但是這會引發重新聲明錯誤。
$ user = User :: find();如果它沒有指定外鍵,你希望這個返回什麼? – craig1231
看起來在頂層用法中,'find()'是'User'類中的一個(靜態)函數,但在底層使用中,find()是Message類中的一個方法。哪一個?都? – jedwards
也許這是一個不清楚的例子,我忽略了這些參數,因爲它們看起來與問題無關,但我會用更準確的表示法來清除它,以確定它是如何工作的。 –