self ou $this em PHP: quando e como usar? Guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Quando usar self e quando usar $this? Entenda de uma vez por todas

\n\n

Se 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.

\n\n

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.

\n\n

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\n

Se 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
\n\n

Mas, como sempre, o diabo está nos detalhes. Vamos nos aprofundar.

\n\n

O 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.

\n\n
<?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\n

Simples: $this->nome significa "pegue a propriedade nome do objeto que chamou este método".

\n\n

O que é self?

\n\n

self é 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).

\n\n
<?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\n

Observe: 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.

\n\n

Diferença principal: self vs $this na herança

\n\n

Aqui é onde a coisa fica interessante. Imagine que você tem uma classe base Animal e uma classe filha Cachorro.

\n\n
<?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

Blogs

Book Recommendations