2012-09-06 58 views
0

在第一種情況下,我們在對象上下文中調用函數。在第二種情況下,我們有類上下文。 父母::根據上下文同時工作像這樣和自己嗎?父::是否自動確定類和對象調用上下文?

class par_parent{ 
    private $var='value1'; 
    private static $val='value2'; 
    public function call(){ 
     var_dump('Object '.$this->var); 
    } 
    public static function staticCall(){ 
     var_dump('Static '.self::$val); 
    } 
} 

class par_child extends par_parent{ 
    public function callObj(){ 
     parent::call(); 
    } 

    public static function callStatic(){ 
     parent::staticCall(); 
    } 
} 



$obj=new par_child(); 
$obj->callObj(); 
**//string 'Object value1' (length=13)** 
par_child::callStatic(); 
**//string 'Static value2' (length=13)** 
+0

查看PHP文檔[here](http://php.net/manual/en/keyword.parent.php)。 – Josh

+0

是的,'parent ::'必須在上下文中工作。如果沒有上下文,它會如何知道哪一類是父類? – nickb

+0

我的問題是關於如何在類和對象上下文中同時使用$ this->和self ::。我沒有在文檔中找到答案。 – yurisnk

回答

0

parent::被綁定像self::關鍵字,總是能看到它已經明智定義代碼,而不是從那裏叫,所以在本質上它的工作方式類似於self::關鍵字的上下文。如果您需要它像$this一樣工作,請使用延遲靜態綁定提供static::。考慮下面這個例子:

class A { 
    protected static $v = 'a'; 
    public static function staticsay() { 
     print static::$v; 
    } 

} 
class B extends A { 
    protected static $v = 'b'; 
    public static function say(){ 
     print parent::$v; 
    } 
} 
class C extends B { 
    protected static $v = 'c'; 
    public static function selfsay(){ 
     print parent::$v; 
    } 
} 

C::say(); // prints 'a' 
C::selfsay(); // prints 'b' 
C::staticsay(); // prints 'c' 

這裏我們稱之爲say()方法上C它來自類B所以它的parent::意味着AA::$v是「A」,因此打印出。

雖然parent::C指向類B,它看到它的$v爲'b'。

用PHP 5.3來得晚靜態綁定和static::關鍵字,可以讓你訪問static變量和方法在基類中的靜態方法,使得A::staticsay將看到從類C$v

+0

但是我的父母問題:: 它可以像父類一樣使用$ this->或self ::或者可以像static ::或其他類似的東西? – yurisnk

+0

哦,我完全錯過了這一點。重申答案。 – complex857

相關問題