2012-06-04 41 views
0

我有這樣的場景:繼承和PHP - 父母的電話之後,這是什麼?

class A extends B { 
    public function test() { 
     parent::test(); 
    } 
} 

class B extends someCompletelyOtherClass { 
    public function test() { 
     //what is the type of $this here? 
    } 
} 

什麼是$這在B級的功能測試的類型? A還是B?我試過了,它的A,我在想它的B?爲什麼是A?

謝謝!

+0

首先,我要正確地命令這些類(在這樣做後它會更有意義)。 '$ this'的值是類'A'。 – Christian

回答

0

問題是,您正在靜態調用test(),即在類上下文中。這是一個錯誤,靜態調用非靜態函數(不幸的是,PHP不強制執行此操作)。

您應該使用$this->test()而不是parent::test()

+0

我更新了我的問題,我不是在類上下文中調用它,而是在函數上下文中調用它。 – EOB

-1

在PHP中,關鍵字「$ this」用作類的自引用,您可以使用它來調用和使用類函數和變量。這裏有一個例子:

class ClassOne 
{ 
    // this is a property of this class 
    public $propertyOne; 

    // When the ClassOne is instantiated, the first method called is 
    // its constructor, which also is a method of the class 
    public function __construct($argumentOne) 
    { 
     // this key word used here to assign 
     // the argument to the class 
     $this->propertyOne = $argumentOne; 
    } 

    // this is a method of the class 
    function methodOne() 
    { 
     //this keyword also used here to use the value of variable $var1 
     return 'Method one print value for its ' 
      . ' property $propertyOne: ' . $this->propertyOne; 
    } 
} 

,當你調用parent ::測試(),你實際調用,因爲你是靜態調用它與B類相關的測試功能。嘗試稱它$ this-> test(),你應該得到A不是B.

+0

是的,它是一個自我引用,所以爲什麼$這不是我實際在類中的類型? – EOB

+0

這並不回答原來的海報問題,是嗎? – harald

2

我不是PHP專家,但我認爲這是有道理的。 $這應該指向類型A的實例化對象,即使方法在類B中定義。

如果您創建類B的實例並直接調用它的測試方法,則$ this應該指向一個對象B的類型。

+1

你是對的。它是繼承101.我只想提到有一個叫做''get_parent_class''(http://ca.php.net/manual/en/function.get-parent-class.php)的函數可以用來確定必要時父類的類。 –