Menu
Coddy logo textTech

Modificadores de Acesso em Profundidade

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 39 de 91.

Agora que você entende os três modificadores de acesso, vamos explorar como eles se comportam em cenários de herança. A principal ideia é que os membros protected se tornam acessíveis às classes filhas, enquanto os membros private permanecem ocultos até mesmo para as classes filhas.

<?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 causaria um erro - private!
        // $this->getSerial() também falharia - método private!
    }
}

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

Saída:

Toyota - V6

A classe Car pode acessar $brand (público) e chamar getEngineInfo() (protegido), mas não tem acesso a $serialNumber ou getSerial(), pois eles são privados de Vehicle. Essa distinção permite compartilhar alguns detalhes internos com classes filhas, mantendo outros completamente ocultos.

Ponto-chave: Use protected quando as classes filhas precisarem acessar dados ou métodos internos, e private quando nem mesmo as classes filhas puderem acessar certos detalhes de implementação.

challenge icon

Desafio

Fácil

Vamos criar um sistema de gerenciamento de dispositivos que explora como os modificadores de acesso se comportam em uma herança. Você criará uma classe base Device com propriedades em diferentes níveis de visibilidade e, em seguida, a estenderá com uma classe Smartphone que demonstra quais membros as classes filhas podem ou não acessar.

Você organizará seu código em três arquivos:

  • Device.php: crie uma classe Device que represente dispositivos eletrônicos com diferentes níveis de sensibilidade dos dados. Inclua:
    • Uma propriedade public $brand para o nome do fabricante
    • Uma propriedade protected $modelNumber para identificação interna
    • Uma propriedade private $manufacturingCode para dados exclusivos da fábrica
    O construtor deve aceitar os três valores. Adicione um método private getManufacturingCode() que retorne o código de fabricação. Adicione um método public getModelInfo() que retorne "Model: [modelNumber]". Por fim, adicione um método public getFullCode() que retorne "[brand]-[manufacturingCode]". Isso demonstra como a própria classe pode acessar seus membros privados.
  • Smartphone.php: crie uma classe Smartphone que estenda Device. Inclua o arquivo Device. O construtor deve aceitar brand, modelNumber, manufacturingCode e o nome de um sistema operacional. Chame o construtor da classe pai com os três primeiros valores e, em seguida, armazene o sistema operacional em uma propriedade privada. Adicione um método público getDeviceDetails() que retorne "[brand] [modelNumber] running [os]". Observe que você pode acessar diretamente o $brand público e o $modelNumber protegido, mas não pode acessar diretamente o $manufacturingCode privado: seria necessário usar o método público herdado getFullCode().
  • main.php: inclua o arquivo Smartphone. Você receberá quatro entradas: um nome de marca, um número de modelo, um código de fabricação e um sistema operacional. Crie uma instância de Smartphone com esses valores. Imprima três linhas:
    • O resultado da chamada de getDeviceDetails()
    • O resultado da chamada do método herdado getModelInfo()
    • O resultado da chamada do método herdado getFullCode()

Este desafio destaca a distinção principal: sua classe Smartphone pode usar livremente o $modelNumber protegido herdado de Device, mas o $manufacturingCode privado e getManufacturingCode() permanecem completamente ocultos: acessíveis somente por meio da interface pública que Device decide expor.

Experimente você mesmo

<?php
require_once 'Smartphone.php';

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

// TODO: Crie uma instância de Smartphone com os valores de entrada

// TODO: Imprima o resultado de getDeviceDetails()

// TODO: Imprima o resultado do método herdado getModelInfo()

// TODO: Imprima o resultado do método herdado getFullCode()
?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online