În lumea WordPress este recomandarea asta: toate funcțiile să fie prefixate de ceva. E.g. nu ai get_user_title()
ci my_plugin_get_user_title()
. Treaba asta evită tot felul de conflicte prezente și viitoare într-un sistem cu măruntaie antice.
Ca o paranteză: în WP nu exista get_post_type_archive_link()
, prin urmare a apărut un plugin. Ghici ce s-a întâmplat când funcția a fost introdusă în core? Exact, servere pe butuci și clienți fericiți
Ai puțină clasă!§
O alternativă la prefixarea funcțiilor? Le pui frumușel într-o clasă, le faci metode statice:
class MyPlugin
{
public static function get_user_title(){}
public static function get_site_admin_email(){}
}
În felul ăsta, le poți apela de oriunde: MyPlugin::get_site_admin_email()
. Evităm conflicte, toată lumea e fericită. Call it a day, cum spun americanii.
Chiar dacă pare o idee bună, nu este. Pe termen lung, clasa se va lungi ad infinitum cu metode care nu au nici o legătura între ele. WPML avea la un moment dat o clasă de vreo 12.000 linii. Succes la debug!
OOP§
În mod ideal, fă tot posibilul să te folosești de ceea ce oferă OOP. Tratează lucrurile ca pe obiecte și profită pe cât se poate de moșteniri, polimorfism șamd.
Ok, dar din varii motive nu vrei să faci asta, ci vrei să păstrezi funcții stand alone. Nu le prefixa, folosește de namespaces.
Namespace§
O alternativă mai elegantă este să folosești… namespaces. Este un concept nou în PHP, abia are vreo zece ani ( ), prin urmare unii sunt oarecum reticienți în a folosi tehnologie de ultimă oră.
Poți converti codul de mai sus destul de simplu:
namespace MyPlugin;
public static function get_user_title(){}
public static function get_site_admin_email(){}
Bonus: Sub-namespace§
Aceste namespace-uri pot avea… sub-namespace-uri, reflectând (opțional) structura ierarhică a fișierelor pe disc.
Prin urmare, poți grupează funcțiile pe responsabilități: ai o funcție ce adaugă un filtru? O pui în myPlugin\filters\wp\pre_get_posts()
. O funcție pentru titlu? myPlugin\filters\wp\get_title()
șamd.
Fara namespace, te poti trezi si cu conflicte de clase, metode:)
Am patit, dar in C#
@Cosmin: si util mai este ca poti sa pui si un alias
https://www.php.net/manual/ro/language.namespaces.importing.php