在阅读《深入php面向对象、模式与实践》一书中的第4.5章节过程中,遇到了“调用上下文”、“解析上下文”两个术语,自己想了半天,还是未能想通顺,于是还是查阅了相关资料,一般情况下,这个时候囫囵吞枣的过去,以后遇到问题还是不会被解决。
参考:http://www.thinksaas.cn/news/0/45/45554.html
事例1
<?php
class A{
protected $value = "A value";
public function printValue(){
echo $this->value;
}
}
class B extends A{
protected $value = "B value";
}
$app = new B();
$app->printValue();
运行结果:B value
由该段代码可以知道,首先定义了一个A类,然后定义了一个继承自A类的B类,两个类中都定义了$value,这个时候去实例化B类,并运行继承了A类中的printValue()方法,结果打印出“B value”。类A中的this调用被称为“调用上下文”。
事例2
<?php
class A{
//只有将属性定义为静态的才能使用self::进行调用
static protected $value = "A static value ";
public function printValue(){
echo self::$value;
}
}
class B extends A{
static protected $value = "B static value";
}
$app = new B();
$app->printValue();
运行结果:A static value
A类中定义了静态属性value,在printValue()方法中使用self::$value进行调用,B类中也定义了一个静态属性value,而后实例化B类,调用继承自A类的printValue()方法,最后打印出的是“A static value”。这个时候,类A中使用self调用被称为“解析上下文”。
这里的self被解析为定义printValue()的A类,而不是解析为调用self的B类。
事例3
<?php
class A{
static protected $value = "A static value ";
}
class B extends A{
public function printValue(){
echo self::$value;
}
}
$app = new B();
$app->printValue();
运行结果:A static value
A类中定义了一个静态属性value,然后定义了一个继承自A类的B类,B类中未定义和A类相同的静态属性value,但是定义了一个printValue()方法,并在该方法中,使用self::$value来调用。按“解析上下文的”说法,运行结果应该是会报错的,说没有value这个属性,但是却打印出了A类中定义的value的值,由此可见,此时self调用根据继承的特性去寻找value值的,这点php并未严格执行调用上下文和解析上下文。