假定:你有多个类,类中的
show()
方法均相同,使用self
绑定当前类属性,从以下代码可以看出:代码冗余
案例代码:
class Demo1
{
public static $name='Peter';
public static $like='PHP';
public static function show()
{
return 'My Name is '. self::$name .'. and I like:' . self::$like;
}
}
class Demo2
{
public static $name='Ben';
public static $like='Java';
public static function show()
{
return 'My Name is '. self::$name .'. and I like:' . self::$like;
}
}
echo Demo1::show();
echo '<br>';
echo Demo2::show();
- 输出结果:
一般情况下:我们可能想到,将show()
方法放在一个类中,继承调用,是否可以呢?
代码冗余优化:
abstract class Demo
{
public static $name;
public static $like;
public static function show()
{
return 'My Name is '. self::$name .'. and I like:' . self::$like;
}
}
class Demo1 extends Demo
{
public static $name='Peter';
public static $like='PHP';
}
class Demo2 extends Demo
{
public static $name='Ben';
public static $like='Java';
}
echo Demo1::show();
echo '<br>';
echo Demo2::show();
- 输出结果:
原因解析:
self::
总是与声明该方法(Demo)的类绑定,并不能绑定调用的类;
方案:使用 static::
进行后期静态绑定
abstract class Demo
{
public static $name;
public static $like;
public static function show()
{
return 'My Name is '. static::$name .'. and I like:' . static::$like;
}
}
class Demo1 extends Demo
{
public static $name='Peter';
public static $like='PHP';
}
class Demo2 extends Demo
{
public static $name='Ben';
public static $like='Java';
}
echo Demo1::show();
echo '<br>';
echo Demo2::show();
- 输出结果:
结论:
self::
总是与声明该方法的类绑定,并不能与调用类绑定static::
关键字,可以自动与当前方法的调用类进行绑定