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

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

PHP致命錯誤:在沒有對象上下文時使用$this

PHP致命錯誤:在沒有對象上下文時使用$this

PHP
森林海 2019-06-25 15:05:39
PHP致命錯誤:在沒有對象上下文時使用$this我有個問題:我正在編寫一個沒有框架的新網絡應用程序。在我的index.php我用的是:require_once('load.php');和在load.php我在用require_once('class.php');加載我的class.php.在我的class.php我有個錯誤:致命錯誤:在class.php中未在對象上下文中在線使用$this.(在本例中為11)舉個例子class.php是這樣寫的:class foobar {     public $foo;     public function __construct() {         global $foo;         $this->foo = $foo;     }     public function foobarfunc() {         return $this->foo();     }     public function foo() {         return $this->foo;     }}在我的index.php我可能在裝貨foobarfunc()就像這樣:foobar::foobarfunc();但也可以$foobar = new foobar;$foobar->foobarfunc();為什么會出現錯誤?
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

您正在調用一個非靜態方法:

public function foobarfunc() {
    return $this->foo();}

使用靜態調用:

foobar::foobarfunc();

使用靜態調用時,將調用該函數。(即使沒有宣布為static),但是,由于沒有對象的實例,所以沒有$this.

因此:

  • 不應對非靜態方法使用靜態調用。
  • 靜態方法(或靜態調用的方法)不能使用$this,它通常指向類的當前實例,因為在使用靜態調用時沒有類實例。


在這里,類的方法使用類的當前實例,因為它們需要訪問$foo類的屬性。

這意味著您的方法需要類的實例-這意味著它們不能是靜態的。

這意味著不應該使用靜態調用:應該實例化類,并使用對象調用方法,就像在代碼的最后一部分中所做的那樣:

$foobar = new foobar();$foobar->foobarfunc();


欲了解更多信息,請參閱PHP手冊中的內容:


還請注意,您可能不需要在您的__construct方法:

global $foo;

使用global關鍵詞會使$foo變量,在所有函數和類的外部聲明,從該方法中提取.而且你可能沒有$foo變量。

訪問$foo 類屬性,您只需使用$this->foo就像你一樣。


查看完整回答
反對 回復 2019-06-25
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

如果您正在調用foobarfunc帶著分辨范圍算子 (::),那你就叫它靜態,例如在類級別而不是實例級別上,因此使用$this不在對象上下文中時$this在類上下文中不存在。

如果您啟用E_STRICT,PHP將在以下方面引起注意:

Strict Standards: Non-static method foobar::foobarfunc() should not be called statically

代之而行

$fb = new foobar;echo $fb->foobarfunc();

在一個側面,我建議不要用global在你的教室里。如果您需要類內的外部內容,請通過構造函數傳遞它。這叫做依賴注入它將使您的代碼更易于維護,更不依賴于外部事物。


查看完整回答
反對 回復 2019-06-25
  • 3 回答
  • 0 關注
  • 530 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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