Une évidence qui ne m’avait pas sauté aux yeux immédiatement et qui est remontée à la surface hier alors que je regardais le code de Dotclear :
Classe Core en singleton, disponible n’importe ou dans le code.
Piqué chez JcDenis1 qui bouscule toute la structure de Dotclear et qui au passage implémente de bonnes choses comme celle-ci !
Parce qu’évidemment on n’instancie qu’une seule fois la classe dcCore et que ça permet ensuite d’utiliser dcCore::app()
partout au lieu d’injecter l’instance, voire de la stocker dans une variable globale.
Exit donc les global $core;
et autres $GLOBALS['core']
partout dans le code !
final class dcCore
{
private static $instance = null;
…
public function __construct($driver, $host, $db, $user, $password, $prefix, $persist)
{
// Singleton mode
if (self::$instance) {
throw new Exception('Application can not be started twice.', 500);
}
self::$instance = $this;
…
}
/**
* Get dcCore singleton instance
*
* @return dcCore
*/
public static function app(): dcCore
{
return self::$instance;
}
…
}
Ça va donc être mis en place pour la 2.23, si j’ai suffisamment de temps avant la release dans un mois, mais sans casser l’existant, c’est-à-dire qu’on pourra continuer à utiliser la variable globale si besoin (compatibilité assurée avec les plugins et thèmes tiers).
Et il n’est pas impossible que la 2.24 suivante casse un peu les signatures des méthodes pour faire sauter ce $core
passé en paramètre un peu partout.
Par ailleurs ce n’est pas la seule variable globale qui traine dans le code, je pense en particulier à $_ctx ; il va falloir que je me penche sur son cas aussi !
Plus généralement je suis en train de me dire que ça milite pour une convergence entre la version « officielle » et celle de JcDenis, pour assurer une transition plus facile du code tiers le moment venu.
-
Ce n’est certainement pas la seule bonne idée que je vais lui piquer ;-) ↩︎
1 De Jean-Christian Paul Denis -
Content de voir que tu arrives à t’inspirer ces gros chamboulements pour une évolution en douceur.
2 De Bernard -
à la votre ;-)
3 De Gilsoub -
Rien compris, mais c’est une super bonne idée :-)
4 De Bernard -
Je suppose que les autres méthodes de la classe
dcCore
restent accessibles (les …)5 De Franck -
Oui bien sûr, rien ne change de ce point de vue ; et d’ailleurs j’ai fait en sorte que le code existant (thèmes et plugins tiers) soit compatible avec cette nouvelle gestion.
6 De saymonz -
L’usage d’une syntaxe type
dcCore::app()->function ()
est-il supporté avec cette nouveauté ?Faudrait que je regarde la doc, mon PHP est rouillé, mais qu’un appel à une fonction statique (
app()
) donne accès à une propriété définie dans une instance de la classe (la variable$instance
qui contient l’instance elle-même) n’est pas du tout intuitif pour moi à première vue.7 De Franck -
saymonz oui, c’est supporté, comme par exemple
dcCore::app()->callBehavior('loginPageHTMLHead')
.Quant à ta remarque, c’est un des « avantages » d’utiliser cette classe en mode « singleton ».
8 De Arfy -
Question con, vu que ça “ressemble”, il y a un lien avec le problème de dcMeta du plugin Subscribe to comments que j’avais posté là ? https://forum.dotclear.org/viewtopic.php?id=50553
9 De Franck -
Non pas de lien je pense, c’est plutôt l’évolution du code de Dotclear depuis la 2.12, en particulier la gestion des métadonnées qui a probablement été modifiée depuis sans que le plugin ait été mis à jour.