Одной из основных потребностей, которые у меня есть для позднего статического связывания, является набор статических методов создания экземпляров.
Этот класс DateAndTime является частью библиотеки хронологии, которую я перенес на PHP из Smalltalk / Squeak. Использование статических методов создания экземпляров позволяет создавать экземпляры с различными типами аргументов, сохраняя проверку параметров в статическом методе, так что потребитель библиотеки не может получить экземпляр, который не является полностью допустимым.
Позднее статическое связывание полезно в этом случае, так что реализации этих статических методов создания экземпляров могут определить, какой класс изначально был нацелен на вызов. Вот пример использования:
С 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();
Без позднего статического связывания [как в моей текущей реализации] каждый класс должен реализовывать каждый метод создания экземпляра, как в этом примере:
Без 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);
}
}
По мере увеличения числа методов создания экземпляров и иерархии классов дублирование методов становится настоящей болью в заднице. LSB уменьшает это дублирование и допускает более чистые и более простые реализации.