public / private / protected în PHP

Stabilește cine are acces la o proprietate sau metodă: oricine (public), doar clasa (private) sau și clasele copil (protected).

Sintaxă
public|protected|private tip $proprietate; public|protected|private function metoda() { ... }

Ce face public / private / protected

Cuvintele de vizibilitate protejează datele unui obiect. public înseamnă acces de oriunde. private înseamnă acces doar din interiorul clasei respective. protected înseamnă acces din clasă și din clasele care o extind (cu extends).

Regula practică: fă proprietățile private și oferă metode public care verifică datele înainte să le modifice. Așa nimeni nu poate pune, de exemplu, un sold negativ direct în proprietate.

Din PHP 8.4 poți avea vizibilitate separată la scriere: public private(set) int $sold se poate citi de oriunde, dar se poate modifica doar din clasă.

Exemple

Exemplul 1: Proprietate privată cu metode publice

<?php
class ContBancar
{
    private float $sold = 0;

    public function depune(float $suma): void
    {
        if ($suma <= 0) {
            echo "Suma trebuie să fie pozitivă.\n";
            return;
        }
        $this->sold += $suma;
    }

    public function sold(): float
    {
        return $this->sold;
    }
}

$cont = new ContBancar();
$cont->depune(500);
$cont->depune(-100);
echo "Sold: " . $cont->sold() . " lei";

Rezultat

Suma trebuie să fie pozitivă.
Sold: 500 lei

Exemplul 2: Ce se întâmplă la acces din exterior

Accesul la o proprietate privată din afara clasei aruncă o eroare Error, pe care o putem prinde ca să vedem mesajul.

<?php
class Utilizator
{
    public string $nume = "Ana";
    private string $parola = "secret";
}

$u = new Utilizator();
echo $u->nume . "\n";

try {
    echo $u->parola;
} catch (Error $e) {
    echo $e->getMessage();
}

Rezultat

Ana
Cannot access private property Utilizator::$parola

Exemplul 3: protected: acces în clasa copil

<?php
class Angajat
{
    protected int $salariu = 5000;
}

class Manager extends Angajat
{
    public function salariuCuBonus(): int
    {
        return $this->salariu + 2000;
    }
}

echo (new Manager())->salariuCuBonus();

Rezultat

7000

Greșeli frecvente

  • Faci totul public „ca să meargă”. Orice cod poate modifica atunci datele obiectului fără verificări.
  • Folosești private și te aștepți ca o clasă copil să vadă proprietatea. Clasa copil nu are acces la membrii private ai părintelui. Folosește protected.

Comenzi înrudite

  • class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).
  • extends / parent::: Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.
  • readonly: O proprietate readonly poate primi valoare o singură dată, apoi nu mai poate fi modificată.
  • __construct: Constructorul este metoda rulată automat la new. Pregătește obiectul cu datele de pornire.