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
setrulează și când atribui valoarea din interiorul clasei (de exemplu în constructor). Doar în interiorul propriului hook,$this->numescrie direct valoarea reală. - Încerci să atribui o valoare unei proprietăți virtuale (doar cu
get) și primeștiProperty ... 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.
Î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.