class_exists / interface_exists / enum_exists în PHP

Clase și obiecte PHP 4+ (interface_exists: PHP 5.0.2+, enum_exists: PHP 8.1+)

Verifică dacă o clasă (class_exists), o interfață sau un enum a fost definit.

Sintaxă
class_exists(string $class, bool $autoload = true): bool

Ce face class_exists / interface_exists / enum_exists

class_exists returnează true dacă există o clasă cu numele dat. Numele nu ține cont de majuscule și trebuie scris complet, cu namespace ("App\\Modele\\Produs").

Implicit, dacă clasa nu este încă încărcată, funcția pornește autoloader-ul (spl_autoload_register). Cu al doilea parametru false, verifică doar clasele deja încărcate.

Pentru celelalte tipuri există funcții separate: interface_exists, enum_exists și trait_exists. Atenție: un enum este și clasă, deci class_exists returnează true pentru un enum, dar false pentru o interfață.

Parametri

Parametru Descriere
$class Numele clasei, cu namespace.
$autoload Opțional. false ca să nu pornească autoloader-ul.

Ce returnează

true sau false.

Exemple

Exemplul 1: Clase, interfețe și enum-uri

<?php
interface Exportabil {}
class Raport implements Exportabil {}
enum Format: string { case Pdf = "pdf"; }

var_dump(class_exists("Raport"));
var_dump(class_exists("raport"));
var_dump(class_exists("Exportabil"));
var_dump(interface_exists("Exportabil"));
var_dump(class_exists("Format"));
var_dump(enum_exists("Format"));

Rezultat

bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)

Exemplul 2: Alegerea unei clase după o setare

<?php
class ExportCsv { public function ruleaza() { return "Export CSV gata"; } }
class ExportPdf { public function ruleaza() { return "Export PDF gata"; } }

foreach (["csv", "pdf", "xls"] as $format) {
    $clasa = "Export" . ucfirst($format);
    echo class_exists($clasa) ? (new $clasa())->ruleaza() : "Format necunoscut: $format";
    echo "\n";
}

Rezultat

Export CSV gata
Export PDF gata
Format necunoscut: xls

Greșeli frecvente

  • Dai numele scurt al unei clase dintr-un namespace. use nu contează pentru textul dat funcției: scrie numele complet sau folosește Produs::class.
  • Construiești numele clasei din date primite de la utilizator, fără o listă de clase permise. Cineva poate instanția orice clasă din aplicație.

Comenzi înrudite

  • function_exists: Verifică dacă o funcție există: una din PHP, dintr-o extensie sau definită de tine.
  • method_exists: Verifică dacă o clasă sau un obiect are o metodă cu un anumit nume.
  • spl_autoload_register: Înregistrează o funcție care încarcă automat fișierul unei clase prima dată când clasa este folosită.
  • interface / implements: O interfață este o listă de metode pe care o clasă promite să le aibă. Clasa le scrie cu implements.
  • enum: Definește un tip cu un set fix de valori posibile, de exemplu statusurile unei comenzi.