Позволяет обращаться к вызывающему а не содержащему классу.
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.