Property hooks (get / set) în PHP

Cod care rulează automat când o proprietate este citită (get) sau modificată (set), fără metode getter și setter separate.

Sintaxă
public tip $nume {
    get => expresie;
    set(tip $valoare) { $this->nume = ...; }
}

Ce face Property hooks (get / set)

Un hook este un bloc de cod atașat unei proprietăți. Hook-ul get rulează când cineva citește proprietatea, iar set când i se atribuie o valoare. Din afară, proprietatea se folosește normal: $p->nume = "..." și echo $p->nume.

O proprietate care are doar get și nu folosește $this->proprietate în el este virtuală: nu ocupă memorie, valoarea se calculează la fiecare citire și nu poate fi scrisă. În set, scrii valoarea reală cu $this->nume = ....

Hook-urile pot apărea și în interfețe (public string $nume { get; }): clasa care implementează interfața trebuie să ofere o proprietate care se poate citi.

Parametri

Parametru Descriere
get Returnează valoarea citită. Forma scurtă: get => expresie;. Forma lungă: get { return ...; }.
set(tip $valoare) Primește valoarea atribuită. Tipul și numele parametrului se pot omite: atunci parametrul se numește $value.

Ce returnează

Nimic: este o declarație de proprietate. Hook-ul get dă valoarea citită.

Exemple

Exemplul 1: Curățarea valorii la atribuire

<?php
class Client
{
    public string $email {
        set(string $valoare) {
            $this->email = strtolower(trim($valoare));
        }
    }
}

$c = new Client();
$c->email = "  Ana.Popescu@Exemplu.RO ";
echo $c->email;

Rezultat

ana.popescu@exemplu.ro

Exemplul 2: Proprietate virtuală, calculată la citire

pretCuTva are doar get, deci nu poate fi scrisă. O atribuire aruncă Error.

<?php
class Produs
{
    public float $pretCuTva {
        get => round($this->pret * 1.21, 2);
    }

    public function __construct(public string $nume, public float $pret)
    {
    }
}

$p = new Produs("Pâine", 5);
echo "{$p->nume}: {$p->pretCuTva} lei\n";

$p->pret = 8;
echo "{$p->nume}: {$p->pretCuTva} lei\n";

try {
    $p->pretCuTva = 3;
} catch (Error $e) {
    echo $e->getMessage();
}

Rezultat

Pâine: 6.05 lei
Pâine: 9.68 lei
Property Produs::$pretCuTva is read-only

Exemplul 3: Validare în set

<?php
class Nota
{
    public int $valoare {
        set {
            if ($value < 1 || $value > 10) {
                throw new InvalidArgumentException("Nota trebuie să fie între 1 și 10, nu $value.");
            }
            $this->valoare = $value;
        }
    }
}

$n = new Nota();
$n->valoare = 9;
echo "Nota: {$n->valoare}\n";

try {
    $n->valoare = 12;
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
}

Rezultat

Nota: 9
Nota trebuie să fie între 1 și 10, nu 12.

Greșeli frecvente

  • Uiți că hook-ul set rulează și când atribui valoarea din interiorul clasei (de exemplu în constructor). Doar în interiorul propriului hook, $this->nume scrie direct valoarea reală.
  • Încerci să atribui o valoare unei proprietăți virtuale (doar cu get) și primești Property ... is read-only.
  • Combini hook-uri cu readonly: nu este permis. Pentru „citire publică, scriere internă” folosește vizibilitatea asimetrică (public private(set)).

Comenzi înrudite

  • readonly: O proprietate readonly poate primi valoare o singură dată, apoi nu mai poate fi modificată.
  • Obiecte leneșe (newLazyGhost, newLazyProxy): Creează un obiect a cărui inițializare (de exemplu citirea din baza de date) rulează abia la prima folosire.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Property hooks (get / set)

Ai o nelămurire despre utilizarea comenzii Property hooks (get / set) sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.