Objets <<< |
Ressources | Macros de création automatique de variables globales >>> |
8.10 Créer des variables 8 Développer PHP 4.0 Manuel PHP . Présentation . Entiers (Longs) . Les nombres à virgules flottantes (Doubles, Floats) . Chaînes de caractères (strings) . Booléens . Tableaux . Objets ->Ressources . Macros de création automatique de variables globales . Créations de constantes |
8.10.8 Ressources
Les ressources sont des types de données spéciaux en PHP. Le terme de ressources ne fait pas référence à un type spécial de données, mais représente une méthode d'abstraction, pour gérer n'importe quelle type d'information. Les ressources sont gérées dans une liste spéciale de Zend. Chaque entrée de cette liste dispose d'une définition de type spéciale. Zend gère en interne les références de toutes ces ressources. L'accès aux ressources n'est pas possible directement : il faut utiliser l'API fournie. Aussitot que toutes les références à une ressources sont perdues, une fonction de destruction est appelée. Par exemple, des ressources sont utilisées pour stocker les connexions aux bases de données, ou des pointeurs de fichiers. Le standard de facto d'iomplémentation peut être trouvée dans le module MySQL, mais d'autres modules comme celui d'Oracle utilisent aussi des ressources.
Pour créer une nouvelle ressource, vous devez enregistrer un destructeur de ressource. Comme vous allez stocker n'importe quel type de données dans votre ressource, Zend doit savoir comment les détuire lorsque la ressource devra être libérée. Cela se fait en enregistrant un gestionnaire de ressource, qui sera appelé par Zend dès que votre ressource doit être libérée (manuellemetn ou automatiquement). Cet enregistrement auprès de Zend vous donne le gestionnaire de ressource de cette ressource. Ce gestionnaire est nécessaire à chaque fois que vous aurez à accéder à une ressource de ce type, et la plus part du temps, il est stocké dans une variable globale statique de votre extension. Il n'y a pas de problème de sécurité avec les threads, car ce gestionnaire est crée une fois, durant l'initialisation du module. La fonction d'enrgistrement de votre gestionnaire de ressource est le suivante :
Il y adeux types de gestionnaire de ressources que vous pouvez passer à cette fonction : le destructeur de ressources normales, et le destructeur de ressources persistantes. Les ressources sont utilisées dans le cas des connexions aux bases de données. Lorsque vous enregistrez une ressource, l'un de ces deux gestionnaires doit être fourni. Si vous n'en utilisez qu'un seul, passez la valeur de NULL pour l'autre. zend_register_list_destructors_ex accepte les paramètres suivants :
Les destructeurs de ressources (permanantes ou normales) ont le prototype suivant :
Le pointeur
rsrc
référence une structure comme celle-ci :
Le membre
void *ptr
est le pointeur réel de votre
ressource.
Maintenant que nous savons comment démarrer, définissons la ressource que nous souhaitons dans Zend. C'est simplement une structure avec deux entiers membres :
Notre destructeur de ressource va probablement ressembler à ceci :
Maintenant que nous avons définit
Pour enregistrer réellement votre nouvelle ressource, vous pouvez soit utiliser la fonction zend_register_resource ou bien la macro zend_register_resoure , qui sont toutes les deux définies dans le fichier d'entête zend_list.h . Bien que les arguments des deux soient exactement les mêmes, c'est une bonne idée que d'utiliser la macro pour assurer une meilleure compatibilité :
Ce qui se passe en réalité lorsque vous enregistrez une novuelle ressource, c'est que vos valeurs sont insérées dans une liste interne de Zend, et que le résultat est stocké dans l'enveloppe zval * fournie :
La valeur retournée
rsrc_id
identifie de manière unique
la nouvelle ressource. Vous pouvez utiliser la macro
RETURN_RESOURE
pour la retourner à l'utilisateur.
Zend prend en charge la ressource. Aussitôt que toutes les références à cette ressources seront perdues, le destructeur que vous avez enregisté sera appelé. La magie de ce concept est que vous n'avez pas à vous soucier de fuites de mémoire, introduites par votre module : notez bien toutes les allocations que votre ressource demande. Aussitôt que cette mémoire doit etre libérée, Zend vous appelera, et vous demandera de les libérer. keeps track of all references to this resource. As soon as Mainteant que l'utilisateur a sa ressource, et il la passe à chacune de vos fonctions qui en a besoin. Le champs value.lval dans l'enveloppe zval * contient une clé vers votre ressource, et sert donc à la récuperer, avec la macro suivante : ZEND_FETCH_RESOURCE :
Pour forcer la suppression d'une ressource de la liste, utilisez la fonction zend_list_delete . Vous pouvez aussi former le compteur de référence à 0 si vous savez que vous allez creer un autre référence pour une valeur précédemment allouée (par exemple, si vous réutilisez une connexion à une base de données par défaut). Pour recherche les ressources déjà allouée, utilisez la fonction zend_list_find . L'API complète est disponible dans le fichier zend_list.h . |
<< | Ressources | >> |
Objets | Créer des variables | Macros de création automatique de variables globales |