J'ai codé une classe de configuration simple pour mon propre cadre.
Il existe des fonctions simples telles que et maintenant, je veux mettre en place un mécanisme d'autosave. J'ai eu l'idée de créer une instance (dans ma fonction init ()) dont get () code>,
SET () code> ou
loadfile () code>.
Mais toutes les fonctions et variables sont statiques. P>
__ destruct () code> appellera la fonction statique
destruct () code> fonction: p>
<?php
class Config
{
static private $autoSave;
static public function get() {} /* set(), save(), load(), etc. */
static public function init($autoSave)
{
self::$autoSave = $autoSave;
new Config();
}
static public function destruct()
{
if (self::$autoSave)
self::save();
}
public function __destruct()
{
Config::destruct();
}
}
?>
4 Réponses :
à l'intérieur de votre méthode code> init code>, ajoutez un appel à regis_shutdown_function code>
:
register_shutdown_function(array('Config', 'destruct'));
Avez-vous regardé register_shutdown_function ? Vous pouvez ajouter votre méthode à la partie d'arrêt du script. P>
Cela pourrait également valoir la peine d'examiner le modèle Singleton . P>
Oui, mais je ne voulais pas réserver la fonction pour la classe de configuration.
Vous pouvez avoir plusieurs fonctions d'arrêt enregistrées, si c'est votre inquiétude. Enregistrement, l'enregistrement n'enregistre pas les numéros précédemment enregistrés, si c'est ce que vous vouliez dire par "réserve".
Eh bien, si l'une de ces fonctions d'arrêt appelle sortie () code> Les autres ne sont pas appelés autres -
__ destruct () code> est immunisé contre ce comportement.
Y a-t-il de meilleures solutions ou est mon modèle de conception complètement faux dans ce cas? P>
Les destructeurs sont appelés des objets uniquement, pas pour les classes statiques. P>
à la place, vous pouvez convertir votre classe de statique en régularisant afin que vous puissiez en créer une instance. Ensuite, il aura le destructeur. De plus, il rend votre code plus facile à réutiliser et à tester. P>
En outre, vous pouvez mettre en place des méthodes magiques pour
__ obtenir code> et
__ ensemble code> ou
ou
ou
ou
ArrayAccess Code> qui est souvent utile pour un stockage facile des données et un accès comme pour une configuration. P>
Alternativement, vous pouvez ajouter un objet destructeur à un membre de la classe statique pour obtenir ce que vous recherchez: P>
class ConfigDestructor { public function __destruct() { Config::destruct(); } } class Config { static private $destructorInstance; static private $autoSave; static public function get() {} /* set(), save(), load(), etc. */ static public function init($autoSave) { if (null === self::$destructorInstance) self::$destructorInstance = new ConfigDestructor(); self::$autoSave = $autoSave; } static public function destruct() { if (self::$autoSave) self::save(); } }
Je connais déjà cette fonction mais je pensais qu'il y avait d'autres moyens. Et j'ai également construit une solution de contournement pour le chemin. Je sauvegarde simplement une poignée de fichier en chargement. BTW Au début, ma classe n'a pas de fonctions statiques, je l'ai convertie au code ci-dessus.
@ user603003: Je viens d'ajouter un moyen de le faire avec un objet ConfigDestructor code> si vous voulez vraiment rester statique. Mais je vous recommande vivement de ne pas faire de fonctions de classe statique qui en général, mais que la configuration fonctionne comme un objet.
J'utilise donc mon premier code qui contenait des fonctions à 100% orientées objet.
Vous pouvez créer une instance de cette classe statique sur Autorégister. Cela fonctionne bien pour moi. P> ... et pour ceux qui ne le font pas Comme le code lisible (il est non testé): P> class staticInstances()
{
private static $list = array();
public static function add($class)
{
self::$list[] = new $class();
}
function __distruct()
{
foreach (self::$list as $class)
unset(self::$list);
}
}
$staticInstances = new staticInstances();
spl_autoload_register(function ($class)
{
...
if ($isStatic) staticInstances::add($class);
...
});
WOW, une réponse même 1 an après que j'ai posé la question. Votre code pourrait fonctionner correctement, mais il utilise des variables globales - une chose qui doit éviter un programmeur.
Ensuite, construisez une classe avec une fonction statique addclass () et instanciez cette classe. Mais c'est une overcive à mon avis. C'est ma seule variable globale. N'oubliez pas K.I.S.S.S. aussi souvent que possible. Cela ne signifie pas être paresseux.