2014-06-29 42 views
4

我知道有一個static::self::像之間在這個例子中

<?php 
class One 
{ 
    const TEST = "test1"; 
    function test() { echo static::TEST; } 
} 
class Two extends One 
{ 
    const TEST = "test2"; 
} 

$c = new Two(); 
$c->test(); 

它返回test2的當使用static::TESTtest1的差異(從https://stackoverflow.com/a/13613718/2342518當使用self::TEST時。 但是當使用$this::TEST時,它也返回test2

static::TEST可以在靜態方法中使用,而$this::TEST在使用之前需要一個實例(因此在靜態方法中不可用)。

但是,如果在靜態方法中不能使用$this::,則static::可用於非靜態方法(如示例中所示)。

那麼,在非靜態方法中static ::和$ this ::之間的區別是什麼?


可選完整的測試

<?php 
abstract class AOne 
{ 
    const TEST = "test1"; 
    abstract public function test(); 
} 
class OneStatic extends AOne 
{ 
    public function test() 
    { 
     return static::TEST; 
    } 
} 
class TwoStatic extends OneStatic 
{ 
    const TEST = "test2"; 
} 
class OneSelf extends AOne 
{ 
    public function test() 
    { 
     return self::TEST; 
    } 
} 
class TwoSelf extends OneSelf 
{ 
    const TEST = "test2"; 
} 
class OneThis extends AOne 
{ 
    public function test() 
    { 
     return $this::TEST; 
    } 
} 
class TwoThis extends OneThis 
{ 
    const TEST = "test2"; 
} 

$objects = array(
    'one, static::'  => new OneStatic(), 
    'two, static::'  => new TwoStatic(), 
    'one, self::'  => new OneSelf(), 
    'two, self::'  => new TwoSelf(), 
    'one, $this::'  => new OneThis(), 
    'two, $this::'  => new TwoThis(), 
); 

$results = array(); 
foreach ($objects as $name=>$object) 
    $results[$name] = $object->test(); 

var_dump($results); 
?> 

其中產量

  • '之一,靜態::'=> 'TEST1'
  • '兩個靜態::' =>'test2'
  • 'one,self ::'=>'test1'
  • '二,自我::'=> 'test1的'
  • '之一,這$ ::'=> 'test1的'
  • '二,本$ ::'=> 'test2的'

所以,自我指的是定義方法的類,但在這些非靜態方法中,$this::static::之間沒有區別。

+0

你最後的結論確實是正確:) –

+0

可能重複[OO PHP從另一個類訪問公共變量](http://stackoverflow.com/questions/17576843/oo-php-accessing-public-variable-from-another-類) – DanFromGermany

回答

0

確實沒有一個。隨着時間的推移,::功能已被擴展,所以左側不需要是類文字,但也可以是具有類名稱的對象實例或字符串變量。大約在同一時間,延遲靜態綁定與static關鍵字一起引入。正如你所說,$this不能用於靜態方法,所以static是後期靜態綁定的明顯而唯一的選擇。

但是,在對象實例中,可以使用static::來引用晚期靜態綁定類,該類將是當前對象實例的類。或者您可以使用$this::作爲能夠使用對象實例作爲<class of this object $var>::的簡寫的副作用。最終的結果是一樣的,它只是在這個特定點上發生重疊的功能。內部運作有些不同,但我想不出有什麼區別。

只是爲了完成維恩圖:

只有static可以這樣做:

public static function foo() { 
    static::FOO; 
} 

只有$var::可以這樣做:

$obj = new Foo; 
$obj::FOO; 

兩者都可以做到這一點:

public function foo() { 
    static::FOO; 
    $this::FOO; 
}