Php中的调用上下文和解析上下文

在阅读《深入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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果: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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果: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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
运行结果:A static value
  • 1

A类中定义了一个静态属性value,然后定义了一个继承自A类的B类,B类中未定义和A类相同的静态属性value,但是定义了一个printValue()方法,并在该方法中,使用self::$value来调用。按“解析上下文的”说法,运行结果应该是会报错的,说没有value这个属性,但是却打印出了A类中定义的value的值,由此可见,此时self调用根据继承的特性去寻找value值的,这点php并未严格执行调用上下文和解析上下文

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zttaiwx/article/details/53412348

猜你喜欢

转载自blog.csdn.net/weixin_41282397/article/details/81303098
今日推荐