static / self:: în PHP

Clase și obiecte PHP 5+ (late static binding: PHP 5.3+)

Membrii static aparțin clasei, nu unui obiect anume. Se apelează cu NumeClasa::metoda(), fără new.

Sintaxă
public static function metoda() { ... }
NumeClasa::metoda(); self::$proprietate;

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 eroarea Using $this when not in object context.
  • Accesezi o proprietate statică fără dolar: self::total. Pentru proprietăți se scrie self::$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.