Introdução: Por que essa pergunta atormenta todo segundo desenvolvedor PHP?
\n\nSe 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.
Neste artigo, vamos organizar tudo. Você aprenderá:
\n- \n
- Como
selfe$thisdiferem 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
Vamos resolver isso de uma vez por todas!
\n\nRegra básica: estático vs instância
\n\nO 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
Parece simples? Vamos verificar com um exemplo.
\n\nExemplo 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\nAqui tudo faz sentido: $this->sugar é único para cada xícara, e self::$type é comum a todas.
A armadilha da herança: self vs static
\n\nE é 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.
Se você precisa que o código considere a classe de onde foi chamado (ligação estática tardia), use static.
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\nEste 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.
Quando não há como evitar o self?
\n\nExistem situações onde $this simplesmente não funciona, e self é a única opção:
- \n
- Métodos estáticos: dentro de um método declarado como
public static function, não há objeto, então$thisnão está disponível. Apenasself. \n - Constantes de classe: são acessadas via
self::CONSTANT(ouClassName::CONSTANT). \n - Propriedades estáticas:
self::$property. \n - Dentro do construtor ou destrutor: embora
$thisesteja disponível, para operações estáticas é melhor usar