我知道有一個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::TEST
和test1的差異(從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::
之間沒有區別。
你最後的結論確實是正確:) –
可能重複[OO PHP從另一個類訪問公共變量](http://stackoverflow.com/questions/17576843/oo-php-accessing-public-variable-from-another-類) – DanFromGermany