我在以下场景中需要LSB:
如果您想了解有关该主题的更多信息:
我对后期静态绑定的一个主要需求是一组静态实例创建方法.
这个DateAndTime类是我从Smalltalk/Squeak移植到PHP的时间库的一部分.使用静态实例创建方法可以创建具有各种参数类型的实例,同时在静态方法中保留参数检查,以便库的使用者无法获取不完全有效的实例.
在这种情况下,后期静态绑定非常有用,因此这些静态实例创建方法的实现可以确定调用最初所针对的类.以下是一个用法示例:
使用LSB:
class DateAndTime {
public static function now() {
$class = static::myClass();
$obj = new $class;
$obj->setSeconds(time());
return $obj;
}
public static function yesterday() {
$class = static::myClass();
$obj = new $class;
$obj->setSeconds(time() - 86400);
return $obj;
}
protected static function myClass () {
return 'DateAndTime';
}
}
class Timestamp extends DateAndTime {
protected static function myClass () {
return 'Timestamp';
}
}
// Usage:
$date = DateAndTime::now();
$timestamp = Timestamp::now();
$date2 = DateAndTime::yesterday();
$timestamp2 = Timestamp::yesterday();
Run Code Online (Sandbox Code Playgroud)
如果没有后期静态绑定,[在我当前的实现中]每个类必须实现每个实例创建方法,如下例所示:
没有LSB:
class DateAndTime {
public static function now($class = 'DateAndTime') {
$obj = new $class;
$obj->setSeconds(time());
return $obj;
}
public static function yesterday($class = 'DateAndTime') {
$obj = new $class;
$obj->setSeconds(time() - 86400);
return $obj;
}
}
class Timestamp extends DateAndTime {
public static function now($class = 'Timestamp') {
return self::now($class);
}
public static function yesterday($class = 'Timestamp') {
return self::yesterday($class);
}
}
Run Code Online (Sandbox Code Playgroud)
随着实例创建方法和类层次结构的数量增加,方法的重复变成了对接中的真正痛苦.LSB减少了这种重复,并允许更清晰,更直接的实现.