在第一种情况下,我们在对象上下文中调用了函数。在第二种情况下,我们有类上下文。 父::根据上下文,这样做和自我同时工作吗?
class par_parent{
private $var='value1';
private static $val='value2';
public function call(){
var_dump('Object '.$this->var);
}
public static function staticCall(){
var_dump('Static '.self::$val);
}
}
class par_child extends par_parent{
public function callObj(){
parent::call();
}
public static function callStatic(){
parent::staticCall();
}
}
$obj=new par_child();
$obj->callObj();
**//string 'Object value1' (length=13)**
par_child::callStatic();
**//string 'Static value2' (length=13)**
答案 0 :(得分:0)
parent::
与self::
关键字一样绑定,始终可以看到代码明确定义的上下文,而不是来自调用它的位置,因此本质上它就像self::
一样关键词。如果你需要它像$this
一样使用后期静态绑定提供static::
。考虑这个例子:
class A {
protected static $v = 'a';
public static function staticsay() {
print static::$v;
}
}
class B extends A {
protected static $v = 'b';
public static function say(){
print parent::$v;
}
}
class C extends B {
protected static $v = 'c';
public static function selfsay(){
print parent::$v;
}
}
C::say(); // prints 'a'
C::selfsay(); // prints 'b'
C::staticsay(); // prints 'c'
我们在say()
上调用C
方法,它来自班级B
,因此parent::
表示A
,而A::$v
是'a'所以打印出来。
虽然parent::
中的C
指向了班级B
,但它将$v
视为'b'。
使用php 5.3提供后期静态绑定和static::
关键字,可让您访问基类静态方法中的static
变量和方法,以便A::staticsay
看到$v
来自班级C
。