Quando usar self e quando usar $this? Entenda de uma vez por todas
\n\nSe você já escreveu código PHP com orientação a objetos, com certeza já se perguntou: "Afinal, devo usar self ou $this?". Essa dúvida é tão comum que no Stack Overflow o tópico já acumulou dezenas de milhares de visualizações e centenas de comentários. E não é por acaso: a diferença entre eles é um daqueles "detalhes" que pode transformar seu código em algo funcional, mas confuso, ou em algo elegante e claro.
Vamos deixar claro desde já: eles não são intercambiáveis. Cada um tem sua própria filosofia e, mais importante, comportamentos diferentes quando lidamos com herança. Se você usar $this onde deveria usar self, ou vice-versa, pode acabar com erros lógicos difíceis de depurar.
Neste artigo, vamos organizar tudo: do básico aos cenários mais avançados. Vamos nessa!
\n\n\n\n
Resposta rápida (para quem está com pressa)
\n\nSe você quer guardar apenas uma regra, guarde esta:
\n\n- \n
$this->— para acessar propriedades e métodos de instância (do objeto). Funciona apenas dentro de um contexto não estático. \n self::— para acessar propriedades e métodos estáticos da classe. Funciona tanto em contextos estáticos quanto não estáticos. \n static::— "late static binding" (ligação estática tardia). Usado quando você quer que a classe filha sobrescreva o comportamento da classe pai. \n
Mas, como sempre, o diabo está nos detalhes. Vamos nos aprofundar.
\n\nO que é $this?
\n\n$this é uma pseudovariável que se refere ao objeto atual. Ela está disponível apenas dentro de métodos de classe (não estáticos) e aponta para a instância específica com a qual você está trabalhando.
<?php\n\nclass Usuario {\n public string $nome;\n\n public function setNome(string $nome): void {\n $this->nome = $nome; // acessa a propriedade do objeto atual\n }\n\n public function getNome(): string {\n return $this->nome;\n }\n}\n\n$usuario = new Usuario();\n$usuario->setNome('Ana');\necho $usuario->getNome(); // Ana\n\nSimples: $this->nome significa "pegue a propriedade nome do objeto que chamou este método".
O que é self?
\n\nself é uma referência à classe atual, e não ao objeto. Ele é usado para acessar membros estáticos da classe (propriedades e métodos declarados com a palavra-chave static).
<?php\n\nclass Config {\n public static string $nomeApp = 'PythonLib';\n\n public static function getNomeApp(): string {\n return self::$nomeApp; // acessa a propriedade estática da classe\n }\n}\n\necho Config::getNomeApp(); // PythonLib\n\nObserve: self sempre se refere à classe onde ele foi escrito. Mesmo se você criar uma classe filha, o self na classe pai continuará apontando para a classe pai. Essa é a diferença crucial em relação ao static.
Diferença principal: self vs $this na herança
\n\nAqui é onde a coisa fica interessante. Imagine que você tem uma classe base Animal e uma classe filha Cachorro.
<?php\n\nclass Animal {\n public static function quemSou(): string {\n return 'Sou um animal';\n }\n\n public function falar(): string {\n // Usando self — ele está vinculado à classe Animal\n return self::quemSou();\n }\n}\n\nclass Cachorro extends Animal {\n public static function quemSou(): string {\n return 'Sou um cachorro';\n }\n}\n\n$cachorro = new Cachorro();\necho $cachorro->falar(); // Sou um animal