前言
本文就介绍了PHP后期静态绑定static、self、parent的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、后期静态绑定
- 后期静态绑定工作原理是存储了在上一个“非转发调用”的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。
- self::对当前类的静态引用,取决于定义当前方法所在的类。
- static::表示运行时最初调用的类。
class MyClass{
static function MyFun(){
echo __CLASS__ . "<br>";
}
static function MyFun1(){
self::MyFun();
}
}
class TestClass extends MyClass{
static function MyFun(){
echo __CLASS__ . "<br>";
}
}
$foo = new TestClass();
$foo->MyFun1(); //会输出MyClass,因为self::取决于定义当前方法所在的类
class MyClass1{
static function MyFun(){
echo __CLASS__ . "<br>";
}
static function MyFun1(){
static::MyFun();
}
}
class TestClass1 extends MyClass1{
static function MyFun(){
echo __CLASS__ . "<br>";
}
}
$bar = new TestClass1();
$bar->MyFun1(); //会输出TestClass1,因为static::取决于运行时最初调用的类
- 在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。
class MyClass{
private function MyFun(){
echo "MyClass->MyFun<br>";
}
public function MyFun1(){
$this->MyFun();
static::MyFun();
self::MyFun();
}
}
class MyClass1 extends MyClass{}
class MyClass2 extends MyClass{
private function MyFun(){}
}
$foo = new MyClass1();
$bar = new MyClass2();
$foo->MyFun1(); //会输出三次MyClass->MyFun
echo "---------<br>";
$bar->MyFun1(); //输出一次MyClass->MyFun之后报错
- 后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。