====== PHP - Особенности ======

===== Позднее статическое связывание >= v 5.3 =====

==== new static() ====
Создание объекта

=== Неверно ===
<code php>
abstract class DomainObject{
  public static function create(){
    return new self();
  }
}
class Document extends DomainObject();
Document::create();
</code>

=== Верно ===
static позволяет обратиться к вызываемому классу а не текущему как self
<code php>
abstract class DomainObject{
  public static function create(){
    return new static();
  }
}
class Document extends DomainObject();
Document::create();
</code>

=== static::someStaticFunction() ===

Идентификатор для вызова статических методов

=== Неверно ===
<code php>
abstract class DomainObject{

  private $_group;

  public function __construct(){
    $this->_group = self::getGroup();
  }

  public static function create(){
    return new static();
  }
  
  static function getGroup(){
    return "default";
  }
  
  public function Group(){
    return $this->_group;
  }
  
}

class User extends DomainObject{}
class Document extends DomainObject{
  static function getGroup(){
    return "document";
  }
}

echo User::create()->Group(); // return default
echo Document::create()->Group(); // return default
</code>

=== Верно ===
static позволяет обратиться к вызываемому классу а не текущему как self
<code php>
abstract class DomainObject{

  private $_group;

  public function __construct(){
    $this->_group = static::getGroup();
  }

  public static function create(){
    return new static();
  }
  
  static function getGroup(){
    return "default";
  }
  
  public function Group(){
    return $this->_group;
  }
  
}

class User extends DomainObject{}
class Document extends DomainObject{
  static function getGroup(){
    return "document";
  }
}

echo User::create()->Group(); // return default
echo Document::create()->Group(); // return document
</code>