Introducción: ¿Por qué esta pregunta atormenta a cada segundo desarrollador PHP?
\n\nSi alguna vez has escrito en PHP con un estilo orientado a objetos, seguro te has enfrentado al dilema: ¿cuándo usar self y cuándo $this? Esta pregunta es una de las más populares en Stack Overflow (miles de visitas y decenas de votos). Parece que la diferencia es obvia, pero basta con profundizar un poco y hasta los desarrolladores experimentados comienzan a confundirse.
En este artículo lo desglosaremos todo. Aprenderás:
\n- \n
- En qué se diferencian fundamentalmente
selfy$this; \n - En qué situaciones es obligatorio usar cada uno; \n
- Cómo funcionan la herencia y los contextos estáticos; \n
- Y, por supuesto, verás ejemplos de código reales que puedes aplicar de inmediato. \n
¡Vamos a aclararlo de una vez por todas!
\n\nRegla básica: estático vs instancia
\n\nLo más importante que debes recordar:
\n- \n
$this— hace referencia al objeto actual (instancia de la clase). Solo funciona en un contexto no estático. \n self— hace referencia a la clase actual donde está escrito el código. Se usa para acceder a propiedades estáticas, constantes y métodos estáticos. \n
¿Suena simple? Vamos a comprobarlo con un ejemplo.
\n\nEjemplo 1: Clase simple
\n<?php\nclass Coffee\n{\n public static $type = 'Arábica';\n public $sugar = 2;\n\n public function info()\n {\n // $this — para propiedades del objeto\n echo "Azúcar: {$this->sugar} cucharadas.";\n\n // self — para la propiedad estática\n echo "Tipo de café: " . self::$type;\n }\n}\n\n$cup = new Coffee();\n$cup->info(); // Muestra: Azúcar: 2 cucharadas. Tipo de café: Arábica\n?>\n\nAquí todo tiene sentido: $this->sugar es único para cada taza, mientras que self::$type es común para todas.
El engaño de la herencia: self vs static
\n\nAquí es donde empieza lo interesante. Muchos piensan que self se comporta de forma polimórfica, pero no es así. self siempre apunta a la clase donde está escrito, incluso si llamas al método desde una clase hija.
Si necesitas que el código tenga en cuenta la clase desde la que se llamó (enlace estático tardío), usa static.
Ejemplo 2: Herencia y la trampa
\n<?php\nclass Animal\n{\n public static $sound = '...';\n\n public static function speak()\n {\n // ATENCIÓN: self es Animal, ¡no Dog!\n echo self::$sound;\n }\n\n public static function speakCorrect()\n {\n // static es la clase que llamó al método\n echo static::$sound;\n }\n}\n\nclass Dog extends Animal\n{\n public static $sound = '¡Guau!';\n}\n\nDog::speak(); // Muestra: ... (porque self = Animal)\nDog::speakCorrect(); // Muestra: ¡Guau! (porque static = Dog)\n?>\n\nEste ejemplo es una causa frecuente de errores. Si estás escribiendo una biblioteca y esperas que las clases hijas puedan sobrescribir propiedades estáticas, usa siempre static en lugar de self.
¿Cuándo es imprescindible usar self?
\n\nHay situaciones donde $this simplemente no funciona y self es la única opción:
- \n
- Métodos estáticos: dentro de un método declarado como
public static function, no hay objeto, por lo que$thisno está disponible. Soloself. \n - Constantes de clase: se accede a ellas mediante
self::CONSTANT(oClassName::CONSTANT). \n - Propiedades estáticas:
self::$property. \n - Dentro del constructor o destructor: aunque allí
$thisestá disponible, para operaciones estáticas es mejor usar