分享九:php易混淆的语法

一:php后期静态绑定

从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类

该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的,也可以成为“静态绑定”;因为他可以用于(但不限于静态方法的调用)。

self::的限制

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

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

 

打印结果:A

后期静态绑定的用法

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

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class 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 

后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
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();
?>

 

打印结果:

A C C

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class a {
  static public function test() {
    print get_called_class();
  }
}
  
class b extends a {
}
  
a::test();
b::test();
  
?>

 

打印结果:
a

b

特别声明:

get_called_class();获得类的名称静态方法中调用

<?php
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();
?>

posted @   一束光  阅读(351)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2014-10-21 话说C语言const用法
2014-10-21 size_t 类型
2013-10-21 html5中script的async属性
2013-10-21 php易混淆知识点

友情链接

CFC4N
点击右上角即可分享
微信分享提示