最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

php实现后期静态绑定

来源:动视网 责编:小采 时间:2020-11-09 08:43:28
文档

php实现后期静态绑定

php实现后期静态绑定:后期静态绑定工作原理是存储了在上一个非转发调用(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的转发调用(forwardin
推荐度:
导读php实现后期静态绑定:后期静态绑定工作原理是存储了在上一个非转发调用(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的转发调用(forwardin


self:: 的

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

例:

class A {
 public static function who () {
 echo __CLASS__ ;
 } public static function test () {
 self :: who ();
 }
}class B extends A {
 public static function who () {
 echo __CLASS__ ;
 }
}

B :: test ();

结果:

A

static(后期静态绑定)

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

例:

<?phpclass A {
 public static function who() {
 echo __CLASS__;
 } public static function test() {
 static::who(); // 后期静态绑定从这里开始
 }
}class B extends A {
 public static function who() {
 echo __CLASS__;
 }
}

B::test();?>

结果:

B

static 和 $this 的区别

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 只能用static:: 调用静态属性。

例:调用私有方法

<?phpclass A {
 private function foo() {
 echo "success!\n";
 } public function test() {
 $this->foo(); static::foo();
 }
}class B extends A {
 /* foo() will be copied to B, hence its scope will still be A and
 * the call be successful */}class C extends A {
 private function foo() {
 /* original method is replaced; the scope of the new one is C */
 }
}$b = new B();$b->test();$c = new C();$c->test(); //fails

结果:

success!
success!
success!
Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

转发和非转发调用

后期静态绑定的解析会一直到取得一个完全解析了的静态调用信息为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

例:

class A {
 public static function foo() {
 static::who();
 } public static function who() {
 echo __CLASS__."\n";
 }
}class B extends A {
 public static function test() {
 A::foo(); parent::foo(); self::foo();
 } public static function who() {
 echo __CLASS__."\n";
 }
}class C extends B {
 public static function who() {
 echo __CLASS__."\n";
 }
}

C::test();

结果:

ACC

文档

php实现后期静态绑定

php实现后期静态绑定:后期静态绑定工作原理是存储了在上一个非转发调用(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的转发调用(forwardin
推荐度:
标签: 绑定 php 实现
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top