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