Refolosirea unei biblioteci în cadrul mai multor plugin-uri/teme

De-a lungul timpului am tot scris și strâns o colecție de clase ce mă ajută în dezvoltarea temelor și a plugin-urilor de WordPress. Să-i zicem că am făcut un fel de framework bibliotecă.

Problema pe care o am acum este următoarea: așa cum am zis aici, aș vrea să public câteva plugin-uri, dar nu știu cum ar trebui să procedez cu clasele mele (ce le folosesc cam peste tot) astfel încât să le pot include în toate plugin-urile fără să am conflicte.

O soluție ar fi să fac un if( !class_exists( 'Foo' ) ){ require "Foo.php"; }. Dar răsare o altă întrebare: dacă un plugin folosește o metodă dintr-o clasă Foo mai veche inclusă de un alt plugin de-al meu? (metodă ce nu exista în versiunea respectivă)

O a doua soluție ar fi composer + autoloader. Dar asta presupune atât de mulți pași încât un utilizator atehnic nu doar că va fi descurajat dar sigur va face prostii :blush:

Și, în cele din urmă, o altă soluție ar fi să fac această bibliotecă un plugin de sine stătător ce va fi refolosit în toate celelalte plugin-uri.

Ceva idei/sugestii despre cum aș putea rezolva problema?

Eu as folosi namespace-uri, ar fi cea mai usoara implementare. Probabil te-ai gandit si tu la asta si as vrea sa stiu de ce NU ai ales-o (chiar sunt curios).

Stiu ca php 5.2 mai are 17% market share, dar totusi…

Păi eu folosesc namespace-uri, dar fiind în cadrul unei biblioteci folosită/inclusă în două plugin-uri, tot voi avea conflict. Nu?

Nu stiu daca ai gasit solutie intre timp, dar trecerea bibliotecii ca mu-plugins mie imi rezolva problema in genere. Peste tot e folosita cu if (class_exists) deci varianta din mu-plugins are precedenta.

1 Like

require_once “Foo.php”;

[quote]The require_once statement is identical to require except PHP will check if the file has already been included, and if so, not include (require) it again.

See the include_once documentation for information about the _once behaviour, and how it differs from its non _once siblings.[/quote]

Cum ajută require_once în situația în care numele clasei nu corespunde cu numele fișierului?

// Foo.php

class Foo {}
//bar.php

class Foo {}

Sau cum ajută dacă ai fișiere cu acelasi nume în locații diferite?

1 Like

@iamntz Fenomenul este foarte vechi, a dat bătăi de cap multor generații de programatori. Are și un nume, ca să îți fie mai ușor să găsești abordări / soluții: Dependency hell. Vezi mai jos, “Solutions”. Nu există nici una perfectă, dar alegi și tu pe cea mai puțin rea.

PS: Și Composer se confruntă cu problema asta.

2 Likes

Chiar dacă nu am găsit o rezolvare, pot fi mulțumit că i-am găsit un nume :smiley:

1 Like

Da, plus că e bine de știut că și alții sunt în același rahat :smiley: Capra vecinului, etc.

2 Likes