PHP static::、self::区别 后期静态绑定

本文详细介绍了PHP中后期静态绑定的概念及其使用方式。通过对比self::与static::的不同,展示了如何在继承类中正确调用静态方法。同时,还探讨了在非静态环境下两者的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文就介绍了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:: 将转发调用信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值