self ou $this em PHP: quando usar o quê? Análise com exemplos

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

Introdução: Por que essa pergunta atormenta todo segundo desenvolvedor PHP?

\n\n

Se você já escreveu em PHP no estilo orientado a objetos, certamente já se deparou com o dilema: quando usar self e quando usar $this? Esta pergunta é uma das mais populares no Stack Overflow (milhares de visualizações e dezenas de votos). Parece que a diferença é óbvia, mas basta aprofundar um pouco — e até desenvolvedores experientes começam a se confundir.

\n\n

Neste artigo, vamos organizar tudo. Você aprenderá:

\n
    \n
  • Como self e $this diferem fundamentalmente;
  • \n
  • Em quais situações cada um é obrigatório;
  • \n
  • Como funcionam a herança e os contextos estáticos;
  • \n
  • E, claro, verá exemplos reais de código que podem ser aplicados imediatamente.
  • \n
\n\n

Vamos resolver isso de uma vez por todas!

\n\n

Regra básica: estático vs instância

\n\n

O mais importante a lembrar:

\n
    \n
  • $this — refere-se ao objeto atual (instância da classe). Funciona apenas em contexto não estático.
  • \n
  • self — refere-se à classe atual onde o código foi escrito. Usado para acessar propriedades estáticas, constantes e métodos estáticos.
  • \n
\n\n

Parece simples? Vamos verificar com um exemplo.

\n\n

Exemplo 1: Classe simples

\n
<?php\nclass Coffee\n{\n    public static $type = 'Arábica';\n    public $sugar = 2;\n\n    public function info()\n    {\n        // $this — para propriedades do objeto\n        echo "Açúcar: {$this->sugar} colheres.";\n\n        // self — para propriedade estática\n        echo "Tipo de café: " . self::$type;\n    }\n}\n\n$cup = new Coffee();\n$cup->info(); // Exibe: Açúcar: 2 colheres. Tipo de café: Arábica\n?>
\n\n

Aqui tudo faz sentido: $this->sugar é único para cada xícara, e self::$type é comum a todas.

\n\n

A armadilha da herança: self vs static

\n\n

E é aqui que começa a parte mais interessante. Muitos pensam que self se comporta polimorficamente, mas não é o caso. self sempre aponta para a classe onde foi escrito, mesmo se você chamar o método a partir de uma classe filha.

\n\n

Se você precisa que o código considere a classe de onde foi chamado (ligação estática tardia), use static.

\n\n

Exemplo 2: Herança e a pegadinha

\n
<?php\nclass Animal\n{\n    public static $sound = '...';\n\n    public static function speak()\n    {\n        // ATENÇÃO: self é Animal, não Dog!\n        echo self::$sound;\n    }\n\n    public static function speakCorrect()\n    {\n        // static é a classe que chamou o método\n        echo static::$sound;\n    }\n}\n\nclass Dog extends Animal\n{\n    public static $sound = 'Au au!';\n}\n\nDog::speak();       // Exibe: ... (porque self = Animal)\nDog::speakCorrect(); // Exibe: Au au! (porque static = Dog)\n?>
\n\n

Este exemplo é uma causa frequente de bugs. Se você está escrevendo uma biblioteca e espera que classes filhas possam sobrescrever propriedades estáticas, sempre use static em vez de self.

\n\n

Quando não há como evitar o self?

\n\n

Existem situações onde $this simplesmente não funciona, e self é a única opção:

\n\n
    \n
  • Métodos estáticos: dentro de um método declarado como public static function, não há objeto, então $this não está disponível. Apenas self.
  • \n
  • Constantes de classe: são acessadas via self::CONSTANT (ou ClassName::CONSTANT).
  • \n
  • Propriedades estáticas: self::$property.
  • \n
  • Dentro do construtor ou destrutor: embora $this esteja disponível, para operações estáticas é melhor usar

Blogs

Book Recommendations