最近在開發(fā)新的建站系統(tǒng)的時候,使用PHP寫代碼的時候報錯Using $this when not in object context是什么原因呢,大概的解釋一下就是$this在靜態(tài)方法中使用了,聽起來似懂非懂的樣子,下面就稍微詳細的解釋一下原因,和處理方式吧。
首先介紹一下靜態(tài)方法和非靜態(tài)方法的區(qū)別和使用方式:
1、實例化要求:
非靜態(tài)方法:必須先實例化,然后通過該實例來調(diào)用非靜態(tài)方法。
靜態(tài)方法:不需要創(chuàng)建類的實例,可以直接通過類名來調(diào)用靜態(tài)方法。
非靜態(tài)方法:可以使用 $this 關(guān)鍵字來引用當前對象實例,訪問其屬性和調(diào)用其方法。
靜態(tài)方法:不能使用 $this 關(guān)鍵字,因為靜態(tài)方法不與任何特定的對象實例關(guān)聯(lián)。(這就是報錯的真實原因)
3、繼承與覆蓋:
非靜態(tài)方法:子類可以覆蓋父類的非靜態(tài)方法。當通過子類實例調(diào)用被覆蓋的方法時,將執(zhí)行子類中的方法(多態(tài)性)。
靜態(tài)方法:子類也可以覆蓋父類的靜態(tài)方法,但行為略有不同。通過子類名調(diào)用靜態(tài)方法將執(zhí)行子類中的方法,但通過父類名調(diào)用將仍然執(zhí)行父類中的方法(除非在子類中使用 parent:: 顯式調(diào)用父類的靜態(tài)方法)。
在稍微細講一下實例化調(diào)用:
1、實例化調(diào)用與靜態(tài)調(diào)用:
2、訪問屬性:
實例化對象可以訪問和修改其非靜態(tài)屬性(包括私有、受保護和公共屬性)。
靜態(tài)方法不能直接訪問非靜態(tài)屬性,因為它們與任何特定的對象實例都不關(guān)聯(lián)。但是,它們可以訪問靜態(tài)屬性。
3、$this:
在非靜態(tài)方法中,你可以使用 $this 關(guān)鍵字來引用當前對象實例。
靜態(tài)方法中不能使用 $this 關(guān)鍵字,因為它們不與任何特定的對象實例關(guān)聯(lián)。
4、繼承:
如果子類覆蓋了父類的非靜態(tài)方法,那么當你通過子類實例調(diào)用該方法時,將執(zhí)行子類中的方法(多態(tài)性)。
如果子類覆蓋了父類的靜態(tài)方法,那么通過子類名調(diào)用該方法將執(zhí)行子類中的方法,但通過父類名調(diào)用將仍然執(zhí)行父類中的方法。
結(jié)論:報錯Using $this when not in object context 的兩種解決方式
1、先實例化,在調(diào)用方法
2、修改類中的$this調(diào)用改為self::調(diào)用