Ce face static / self::
O proprietate static are o singură valoare, comună pentru toată clasa. O metodă static se apelează direct pe clasă, cu operatorul ::, fără să creezi un obiect. Într-o metodă statică nu există $this.
În interiorul clasei, self:: înseamnă clasa în care este scris codul, iar static:: înseamnă clasa pe care s-a făcut apelul (contează la moștenire). Metodele statice sunt des folosite ca „fabrici” care creează obiecte: Produs::dinTablou($date).
Într-o funcție obișnuită, o variabilă declarată static își păstrează valoarea între apeluri.
Exemple
Exemplul 1: Metodă și proprietate statică
<?php
class Utilizator
{
private static int $total = 0;
public function __construct(public string $nume)
{
self::$total++;
}
public static function total(): int
{
return self::$total;
}
}
new Utilizator("Ana");
new Utilizator("Mihai");
new Utilizator("Ioana");
echo "Utilizatori creați: " . Utilizator::total();
Rezultat
Utilizatori creați: 3
Exemplul 2: Metodă statică de tip fabrică
<?php
class Produs
{
public function __construct(public string $nume, public float $pret)
{
}
public static function dinTablou(array $date): static
{
return new static($date["nume"], $date["pret"]);
}
}
$p = Produs::dinTablou(["nume" => "Cablu HDMI", "pret" => 35]);
echo "$p->nume - $p->pret lei";
Rezultat
Cablu HDMI - 35 lei
Exemplul 3: Variabilă static într-o funcție
Variabila $apeluri este inițializată o singură dată și își păstrează valoarea între apeluri.
<?php
function numarVizita(): int
{
static $apeluri = 0;
return ++$apeluri;
}
numarVizita();
numarVizita();
echo "Funcția a fost apelată de " . numarVizita() . " ori.";
Rezultat
Funcția a fost apelată de 3 ori.
Greșeli frecvente
- Folosești
$thisîntr-o metodă statică. Primești eroareaUsing $this when not in object context. - Accesezi o proprietate statică fără dolar:
self::total. Pentru proprietăți se scrieself::$total; fără dolar, PHP caută o constantă. - Pui totul în metode statice. Codul devine greu de testat; folosește static doar pentru lucruri care chiar nu depind de un obiect.
Comenzi înrudite
class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).const: Definește o constantă: o valoare cu nume care nu se mai poate schimba. Poate fi globală sau în interiorul unei clase.extends / parent::: Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.