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 membriiprivateai părintelui. Foloseșteprotected.
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.