self o $this en PHP: ¿cuándo usar cada uno? Análisis con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué esta pregunta atormenta a cada segundo desarrollador PHP?

\n\n

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

\n\n

En este artículo lo desglosaremos todo. Aprenderás:

\n
    \n
  • En qué se diferencian fundamentalmente self y $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
\n\n

¡Vamos a aclararlo de una vez por todas!

\n\n

Regla básica: estático vs instancia

\n\n

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

¿Suena simple? Vamos a comprobarlo con un ejemplo.

\n\n

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

Aquí todo tiene sentido: $this->sugar es único para cada taza, mientras que self::$type es común para todas.

\n\n

El engaño de la herencia: self vs static

\n\n

Aquí 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.

\n\n

Si necesitas que el código tenga en cuenta la clase desde la que se llamó (enlace estático tardío), usa static.

\n\n

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

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

\n\n

¿Cuándo es imprescindible usar self?

\n\n

Hay situaciones donde $this simplemente no funciona y self es la única opción:

\n\n
    \n
  • Métodos estáticos: dentro de un método declarado como public static function, no hay objeto, por lo que $this no está disponible. Solo self.
  • \n
  • Constantes de clase: se accede a ellas mediante self::CONSTANT (o ClassName::CONSTANT).
  • \n
  • Propiedades estáticas: self::$property.
  • \n
  • Dentro del constructor o destructor: aunque allí $this está disponible, para operaciones estáticas es mejor usar

Blogs

Book Recommendations