2011-05-29 16 views
0

我得到一個錯誤,我認爲是因爲我在重構中犯了某種錯誤,但我無法找到關於何時綁定$this的文檔,並且我的錯誤可以通過綁定來解釋靜態。

加分(我實際上無法給你加分)鏈接到有關這種事情在php中的優秀文檔。

[編輯] 我得到的錯誤是告訴我,Subclass::$var在我做的時候不存在,例如,在超類中echo $this->var。儘管如此,$var存在於子類中。

+2

顯示您的代碼,請 – Ibu 2011-05-29 00:04:52

+0

也許您應該詳細說明錯誤並顯示您認爲可能錯誤的代碼。 – GolezTrol 2011-05-29 00:06:18

+0

請詳細說明。 '$ this'在構造器開始的對象中可用,直到結束。問題是什麼? – Tadeck 2011-05-29 00:25:40

回答

0

此作品在PHP中:

class A { 
    public function foo() { 
     echo $this->bar; 
    } 
} 

class B extends A { 
    public $bar = 1; 
} 

$b = new B; 
$b->foo(); // 1 

它的工作原理,因爲PHP的動態範圍解析(即:範圍在運行時解析,而不是編譯時間)。不過,我建議不要這樣做,因爲它確實是一種語言的特殊性。第二,未能在子類中聲明$bar會導致錯誤。我認爲一個班只應該引用它所知道的成員。

相同的代碼,說,在C++:

class A { 

public: 
    void foo() { 
     std::cout << bar; 
    } 

}; 

class B : public A { 

public: 
    int bar; 
    B() { 
     bar = 1; 
    } 

}; 

...會給你一個編譯錯誤(在A :: foo的(): '棒' 在此範圍未聲明)。

+0

爲了清楚起見,你說得對,我想要的是基類(A)中的'abstract protected $ bar'。當然,php只有抽象方法,而不是屬性,所以我不能真正做到「正確」,但評論幾乎和編譯器例外一樣。 – quodlibetor 2011-05-29 17:14:27

1

$this在調用構造函數後變爲可用。邏輯上,您不能在static函數中使用$this

除了在static函數中調用$this以外,沒有太多的東西可以出錯,因爲在PHP中根本沒有辦法。

你得到的錯誤究竟是什麼?代碼也會有用。

+0

+1它可從構造函數的開頭直到對象的銷燬。正如你所想的,OP可能試圖從靜態方法調用'$ this'。 – Tadeck 2011-05-29 00:27:47

+0

我添加了一些細節,這裏不是一個「靜態」問題。我在子和超類中以各種方式使用它。 – quodlibetor 2011-05-29 00:32:48

0

是,$this動態綁定,如由事實以下的輸出爲 「foo」 的證實:

<?php 
class Base 
{ 
    public function ecc(){ 
     echo $this->subvar; 
    } 
} 

class Sub extends Base 
{ 
    public $subvar; 
    public function __construct(){ 
     $this->subvar = 'foo'; 
     $this->ecc(); 
    } 
} 
new Sub(); 
?>