Vizibilitatea Asimetrică (Asymmetric Visibility) este una dintre cele mai spectaculoase facilități introduse în PHP 8.4. Ea permite definirea unor niveluri diferite de acces pentru citirea și scrierea (modificarea) aceleiași proprietăți dintr-o clasă.
Până la PHP 8.4, dacă doreai o proprietate care să poată fi citită liber din exterior, dar modificată exclusiv din interiorul metodelor clasei, erai forțat să o declari private și să scrii o metodă getter clasică (public function getStatus(): string). Cu vizibilitatea asimetrică, scrii o singură linie curată: public private(set) string $status.
Exemplu de utilizare a vizibilității asimetrice în PHP 8.4
<?php
declare(strict_types=1);
class ComandaMagazin {
// Proprietăți cu citire publică, dar modificare restricționată privat:
public private(set) string $numarComanda;
public private(set) string $status;
public protected(set) float $total;
public function __construct(string $numarComanda, float $total) {
$this->numarComanda = $numarComanda;
$this->total = $total;
$this->status = 'în_așteptare';
}
public function marcheazaCaPlatita(): void {
// Mutația este perfect legală din interiorul clasei:
$this->status = 'achitată';
}
}
$comanda = new ComandaMagazin('CMD-1082', 299.99);
// 1. CITIREA este complet publică și directă (fără $comanda->getStatus()):
echo "Comanda {$comanda->numarComanda} are statusul: {$comanda->status}\n";
// 2. SCRIEREA din exterior este blocată la nivel de compilator:
// $comanda->status = 'anulată';
// Fatal error: Cannot modify private(set) property ComandaMagazin::$status from global scope
Combinații Posibile de Vizibilitate
public private(set): Oricine poate citi proprietatea, doar clasa curentă o poate modifica.public protected(set): Oricine poate citi proprietatea, doar clasa curentă și clasele descendente (subclase) o pot modifica.protected private(set): Doar subclasele pot citi proprietatea, doar clasa părinte o poate modifica.