parent ::是否自动确定类和对象调用上下文?

时间:2012-09-06 18:31:34

标签: php class object parent

在第一种情况下,我们在对象上下文中调用了函数。在第二种情况下,我们有类上下文。 父::根据上下文,这样做和自我同时工作吗?

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)**

1 个答案:

答案 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