我知道有一个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