static与self区别浅解

self与static区别

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

self:取决于定义前方法所在的类
static:取决于调用当前方法所在的类,更利于实现多态性

举例说明:

class A 
{
	static function foo()
	{
		echo "This is class ".__CLASS__;
	}
	static function self_get(){
		self::foo();
	}
	static function static_get(){
		static::foo();
	}
}
class B extends A
{
	static function foo(){
		echo "This is class ".__CLASS__;
	}
}
echo "self---<br />";
A::self_get();
echo "<br />";
B::self_get();
echo "<br />------------------------------<br />static--<br />";
A::static_get();
echo "<br />";
B::static_get();

输出:

self---
This is class A
This is class A
------------------------------
static--
This is class A
This is class B

从以上例子可以看出
类A还是类B调用self_get() 的时候 都调用的是 类A中的foo()方法;
而调用使用了后期静态绑定的static_get()方法的时候调用的当前类的foo()方法


class A 
{
	private static function foo()
	{
		echo "This is class ".__CLASS__;
	}
	static function self_get(){
		self::foo();
	}
	static function static_get(){
		static::foo();
	}
}
class B extends A
{
	private static function foo(){
		echo "This is class ".__CLASS__;
	}
}
echo "self---<br />";
A::self_get();
echo "<br />";
B::self_get();
echo "<br />------------------------------<br />static--<br />";
A::static_get();
echo "<br />";
B::static_get();//fails

当方法或属性为private 时 self 不受任何影响,但是static 可能会给出不同的结果 ,以上程序会输出

self---
This is class A
This is class A
------------------------------
static--
This is class A

Fatal error: Uncaught Error: Call to private method B::foo() from context 'A' in D:\myphp_www\PHPTutorial\WWW\demo.php:13 Stack trace: #0 D:\myphp_www\PHPTutorial\WWW\demo.php(29): A::static_get() #1 {main} thrown in D:\myphp_www\PHPTutorial\WWW\demo.php on line 13
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值