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