最近在研究公司业务代码,其中的RPC协议中的上下文不是很理解,就查找了下资料,记录一下
例1
class A{
protected $value = 'class A value';
public function printValue(){
echo $this->value;
}
}
class B extends A{
protected $value = 'class B value';
public function printValue(){
echo $this->value;
}
}
$app = new B();
$app->printValue();
#输出
class B value
之前我的一片博客介绍了static、self还有$this三个之间的区别,想了解的可以看一下
https://blog.csdn.net/TyphoonHao/article/details/93735846
$this此时就是的调用,就称为“调用上下文”
例2
class A{
protected static $value = 'class A value';
public function printValue(){
echo self::$value;
}
}
class B extends A{
protected static $value = 'class B value';
public function printValue(){
echo self::$value;
}
}
$app = new B();
$app->printValue();
#输出
class A value
类A和类B都定义了一个静态变量,当实例化B的时候,调用printValue方法时,B类中没有这个方法,但是由于面向对象特性,B类继承了A类,执行了A类中的printValue方法,此时执行了self的调用,成为“解析上下文”调用;而self指向本类,所以打印A类的value
例3
class A{
protected static $value = 'class A value';
}
class B extends A{
public function printValue(){
echo self::$value;
}
}
$app = new B();
$app->printValue();
#输出
class A value
类A中定义了静态变量value,B中没有定义,但是类B继承了A,然后实例化B去调用printValue方法时,self应该会去“解析上下文”,但是没有value属性,按说应该会报错,但是但打印出了A中的value,这就是由于PHP未严格执行上下文解析和上下文调用