Qual é a diferença entre new self e new static em PHP? Ligação estática tardia
Olá a todos! Estou há três dias lutando com uma estranheza em PHP. Tenho uma classe base que cria suas próprias instâncias através de um método estático. Quando herdo essa classe, espero que a classe filha crie objetos do seu próprio tipo, mas por algum motivo é criado um objeto da classe pai.
Aqui está um exemplo simplificado:
```php
class ParentClass {
public static function create() {
return new self();
}
}
class ChildClass extends ParentClass {
// nenhuma sobrescrita
}
$obj = ChildClass::create();
// $obj é ParentClass, não ChildClass!
echo get_class($obj); // ParentClass
```
Li sobre Ligação Estática Tardia (Late Static Binding) e sobre a palavra-chave `static`, mas não entendo completamente como isso funciona. Por que `new self()` sempre se refere à classe onde este código foi escrito, e não à classe a partir da qual o método foi chamado? E como faço para que `ChildClass::create()` retorne exatamente um objeto `ChildClass`, e não `ParentClass`?
Explique