Позднее статическое связывание | late static bindings

Позволяет обращаться к вызывающему а не содержащему классу.

abstract class BaseObject{
	public static function create(){
		return new static();
	}
}
class User extends BaseObject {}
class Book extends BaseObject {}
$user = User:create();

Благодаря магии (обращению к вызывающему классу) данные код позволяет заменить вот такой:

abstract class BaseObject{}
class User extends BaseObject{
	public static function create(){
		return new User();
	}
}
class Book extends BaseObject {
	public static function create(){
		return new Book();
	}
}
$user = User::create();

Ключевое слово static - можно использовать как идентификатор для вызова статистических методов из нестатического контекста:

abstract class BaseObject{
	private $cat;
	public function __construct(){
		$this->cat = static::getCat();
		echo '<br>' . $this->cat;
	}
	public static function create(){
		return new static();
	}
	static function getCat(){
		return 'default';
	}
}

class User extends BaseObject{}

class Book extends BaseObject {
	static function getCat(){
		return 'book';
	}
}
class HistoryBook extends Book {}
$user = User::create(); 				// default
$history_book = HistoryBook::create(); 	// book

Стандартное поведение сосредоточено в классе BaseObject, но оно переопределяется для Book. Вся суть здесь в том что что метод getCat() сначала ищется в контексте вызывающего класса а не содержащего. Для User - определено стандартное поведение из BaseObject. Для HistoryBook - метод ищется в HistoryBook, а потом по цеопчке вверх в Book