详解详解PHP后期静态绑定分析与应用后期静态绑定分析与应用
给大家总结了PHP后期静态绑定分析与应用的相关知识点,对此有兴趣的朋友可以学习下。
基础知识基础知识
1. 范围解析操作符范围解析操作符 ((::))
可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。
parent用于调用父类中被覆盖的属性或方法(出现在哪里,就将解析为相应类的父类)。
self用于调用本类中的方法或属性(出现在哪里,就将解析为相应的类;注意与$this区别,$this指向当前实例化的对象)。
当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。
2. PHP内核将类的继承实现放在了内核将类的继承实现放在了"编译阶段编译阶段"
<?php
class A{
const H = 'A';
const J = 'A';
static function testSelf(){
echo self::H; //在编译阶段就确定了 self解析为 A
}
}
class B extends A{
const H = "B";
const J = 'B';
static function testParent(){
echo parent::J; //在编译阶段就确定了 parent解析为A
}
/* 若重写testSelf则能输出“B”, 且C::testSelf()也是输出“B”
static function testSelf(){
echo self::H;
}
*/
}
class C extends B{
const H = "C";
const J = 'C';
}
B::testParent();
B::testSelf();
echo "";
C::testParent();
C::testSelf();
运行结果:
AA
AA
结论:
self::和parent::出现在某个类X的定义中,则将被解析为相应的类X,除非在子类中覆盖父类的方法。
3.Static(静态)关键字(静态)关键字
作用:
- 在函数体内的修饰变量的static关键字用于定义静态局部变量。
- 用于修饰类成员函数和成员变量时用于声明静态成员。
- (PHP5.3之后)在作用域解析符(::)前又表示静态延迟绑定的特殊类。
例子:
定义静态局部变量(出现位置:局部函数中)
特征:静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
定义静态方法,静态属性