2014-06-29 43 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; 
}