Menu
Coddy logo textTech

Modificadores de acceso en profundidad

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 39 de 91.

Ahora que entiendes los tres modificadores de acceso, exploremos cómo se comportan en situaciones de herencia. La idea clave es que los miembros protected se vuelven accesibles para las clases hijas, mientras que los miembros private permanecen ocultos incluso para las clases hijas.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber causaría un error - ¡private!
        // $this->getSerial() también fallaría - ¡método private!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

Salida:

Toyota - V6

La clase Car puede acceder a $brand (público) y llamar a getEngineInfo() (protegido), pero no tiene acceso a $serialNumber ni a getSerial() porque son privados de Vehicle. Esta distinción te permite compartir algunos detalles internos con las clases hijas, mientras mantienes otros completamente ocultos.

Punto clave: Usa protected cuando las clases secundarias necesiten acceder a datos o métodos internos, y private cuando ni siquiera las clases secundarias deban modificar ciertos detalles de implementación.

challenge icon

Desafío

Fácil

Construyamos un sistema de gestión de dispositivos que explore cómo se comportan los modificadores de acceso en la herencia. Crearás una clase base Device con propiedades en distintos niveles de visibilidad y después la extenderás con una clase Smartphone que demuestre a qué miembros pueden y no pueden acceder las clases hijas.

Organizarás tu código en tres archivos:

  • Device.php: Crea una clase Device que represente dispositivos electrónicos con distintos niveles de sensibilidad de los datos. Incluye:
    • Una propiedad public $brand para el nombre del fabricante
    • Una propiedad protected $modelNumber para la identificación interna
    • Una propiedad private $manufacturingCode para datos exclusivos de la fábrica
    El constructor debe aceptar los tres valores. Añade un método private getManufacturingCode() que devuelva el código de fabricación. Añade un método public getModelInfo() que devuelva "Model: [modelNumber]". Finalmente, añade un método public getFullCode() que devuelva "[brand]-[manufacturingCode]". Esto demuestra cómo la propia clase puede acceder a sus miembros privados.
  • Smartphone.php: Crea una clase Smartphone que extienda Device. Incluye el archivo Device. El constructor debe aceptar la marca, el número de modelo, el código de fabricación y el nombre de un sistema operativo. Llama al constructor padre con los tres primeros valores y después almacena el sistema operativo en una propiedad privada. Añade un método público getDeviceDetails() que devuelva "[brand] [modelNumber] running [os]". Observa que puedes acceder directamente a la propiedad pública $brand y a la propiedad protegida $modelNumber, pero no puedes acceder directamente a la propiedad privada $manufacturingCode: en su lugar, tendrías que usar el método público heredado getFullCode().
  • main.php: Incluye el archivo Smartphone. Recibirás cuatro entradas: un nombre de marca, un número de modelo, un código de fabricación y un sistema operativo. Crea una instancia de Smartphone con estos valores. Imprime tres líneas:
    • El resultado de llamar a getDeviceDetails()
    • El resultado de llamar al método heredado getModelInfo()
    • El resultado de llamar al método heredado getFullCode()

Este desafío destaca la distinción clave: tu clase Smartphone puede usar libremente la propiedad protegida $modelNumber heredada de Device, pero la propiedad privada $manufacturingCode y el método getManufacturingCode() permanecen completamente ocultos: solo se puede acceder a ellos mediante la interfaz pública que Device decide exponer.

Pruébalo tú mismo

<?php
require_once 'Smartphone.php';

// Leer entradas
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: Crea una instancia de Smartphone con los valores de entrada

// TODO: Imprime el resultado de getDeviceDetails()

// TODO: Imprime el resultado del método heredado getModelInfo()

// TODO: Imprime el resultado del método heredado getFullCode()
?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online