[Traduction][Développement d'extensions php et embarquées] Chapitre 11 -Objets php5
黄舟
Libérer: 2023-03-05 16:26:01
original
1485 Les gens l'ont consulté
Assez juste, mais les fonctions API utilisées par les objets php5 sont toujours construites selon l'API de php4. Si vous avez lu le chapitre 10 "Objets php4", vous serez un peu familier avec le contenu de ce chapitre avant de commencer. chapitre, vous pouvez aimer le chapitre 10 Comme au début, renommer l'extension en sample3 et nettoyer le code redondant, ne laissant que le code squelette de l'extension > Il y a deux composants clés dans les variables d'objet php5. est un identifiant numérique, qui est très similaire à l'ID de ressource numérique introduit dans le chapitre 9 « Type de données de ressource », et joue un rôle utilisé dans Le rôle de la clé pour trouver les instances d'objet dans la table correspondante Les éléments de cette table d'instance. contient des références à zend_class_entry et à la table d'attributs interne
Le deuxième élément est la variable objet Une table de poignées qui vous permet de personnaliser la façon dont le moteur Zend gère les instances. plus loin dans ce chapitre.
zend_class_entry
Une entrée de classe est une représentation interne d'une classe que vous définissez dans l'utilisateur Comme vous l'avez vu dans le chapitre précédent, cette structure est initialisée en appelant INIT_CLASS_ENTRY() avec le nom de la classe et sa table de fonctions. Ensuite, utilisez zend_register_internal_class() pour vous inscrire dans la phase MINIT, vous pensez peut-être « Ça a l'air. à peu près la même chose jusqu'à présent ?", jusqu'à présent, vous avez raison. Commençons maintenant à définir quelques méthodes d'objet. Vous commencerez à voir des méthodes différentes très définies et populaires.
La macro PHP_METHOD() a été introduite dans Zend Engine 2, qui est une encapsulation de la macro PHP_FUNCTION() et combine le nom de la classe et le nom de la méthode, contrairement à php4. Définissez manuellement le nom de la méthode dans l'extension. En utilisant cette macro, les spécifications de résolution d'espace de noms de votre code dans l'extension sont cohérentes avec celles des autres responsables
définition
Définir. l'implémentation d'une méthode, tout comme les autres fonctions, il suffit de la connecter à la table de fonctions de la classe. En plus de la macro PHP_METHOD() utilisée pour l'implémentation, il existe de nouvelles macros qui peuvent être utilisées dans la définition des listes de fonctions.
Comparé au PHP_FE () introduite dans le chapitre 5 "Votre première extension", PHP_ME() ajoute un paramètre classname et un paramètre flags à la fin (pour fournit un contrôle d'accès tel que public, protégé, privé, statique, ainsi que des options abstraites et autres) . Par exemple, pour définir la méthode helloWorld, vous pouvez la définir comme suit :
est très similaire à la macro PHP_FALIAS(), cette macro permet de décrire la méthode du paramètre alias L'implémentation (au sein de la même classe) fournit un nouveau nom spécifié par name. Par exemple, pour copier votre méthode helloWorld, vous pouvez la définir comme suit
<🎜. >
PHP_ABSTRACT_ME(nom de classe, nom de méthode, arg_info)
Par exemple, puisque la méthode Sample3_SecondClass::helloWorld() que vous avez définie précédemment ne nécessite pas d'instance d'objet, vous pouvez modifier sa définition de simple Remplacez ZEND_ACC_PUBLIC par ZEND_ACC_PUBLIC | ZEND_ACC_STATIC, afin que le moteur ne fournisse pas (instance) après l'avoir connu.
Méthode magique
En plus des méthodes magiques de ZE1, ZE2 a ajouté de nombreuses nouvelles méthodes magiques, comme indiqué dans le tableau suivant (ou peut être trouvé sur //m.sbmmt.com/)
Méthode
Utilisation
__construct(...)
Constructeur d'objet appelé automatiquement facultatif ( a préalablement défini une méthode cohérente avec le nom de la classe if). Les deux implémentations de __construct() et classname() existent , dans les versions instanciées Au cours du processus, , donnera la priorité à l'appel de __construct()
__destruct()
Lorsque l'instance quitte la portée, ou demande la résiliation complète , entraîneront tous l'appel implicite de la méthode __destruct() de l'instance pour gérer certains travaux de nettoyage, Par exemple, fermer un fichier ou un descripteur réseau .
__clone()
Par défaut ,Toutes les instances sont de véritables passages par référence.Dans php5, Pour copier réellement une instance d'objet,, vous devez utiliser le clonemot-clé.Lors de l'appel du mot-clé clone sur une instance d'objet,
La méthode __clone() sera exécutée implicitement, ce qui permet à l'objet de copier certaines données de ressources internes requises.
__toString()
Lors de l'utilisation de texte pour représenter un objet ,Par exemple, lors de l'utilisation de l'instruction echo ou print directement sur l'objet,
La méthode __toString() sera automatiquement appelée par le moteur Si la classe implémente cette méthode magique , <🎜. > devrait renvoyer Une chaîne contenant une chaîne décrivant l'état actuel de l'objet .
__get($var )
Si le script demande une propriété invisible d'un objet ( n'existe pas ou est invisible en raison du contrôle d'accès )quand,
__get()la méthode magique sera appelée,Le seul paramètre est le nom de la propriété demandé.implémentation Vous peut utiliser sa propre logique interne pour déterminer la valeur de retour la plus raisonnable à renvoyer .
__set($var , $value)
et __get() sont très similaires à ,
__set() fournit la capacité opposée , qui est utilisée pour gérer la logique d'attribution de valeurs aux propriétés invisibles des objets . Les implémentations de __set() peuvent choisir de créer implicitement ces variables dans des tables attributaires standard , et de définir des valeurs à l'aide d'autres mécanismes de stockage , Ou lancez simplement une erreur et supprimez la valeur .
__call($ fname, $args)
Lorsque vous appelez des méthodes non définies d'un objet, vous pouvez obtenir de superbes résultats en utilisant __call() méthode magique Le traitement de .Cette méthode accepte deux paramètres :Le nom de la méthode appelée ,Un tableau contenant les indices numériques de tous les arguments passés dans l'appel.
__isset($nomvar)
php5.1.0Après , l'appel d'isset($obj->prop) n'est pas seulement un chèque< S'il y a prop dans 🎜>$obj, , appellera également $obj__isset()méthode, évaluation dynamique essayez d'utiliser dynamique Que ce soit les méthodes __get() et __set() peuvent lire et écrire avec succès les attributs
__unset($varname)
Similaire à __isset(), php 5.1 .0 introduit une simple OOPinterface pour la fonction unset() , Il peut être utilisé pour les propriétés de l'objet,Bien que cette propriété puisse ne pas exister dans la table des propriétés standard de l'objet,Mais cela pourrait avoir du sens pour l'espace de propriété dynamique de __get() et __set() , Par conséquent, __unset() est introduit pour résoudre ce problème.
get_property_ptr_ptr() est une variante de read_property(), ce qui signifie qu'elle permet à la portée appelante de remplacer directement le zval * actuel par un nouveau. Le comportement par défaut est de renvoyer le. table de propriétés standard Adresse du pointeur de l'attribut dans .S'il n'existe pas et qu'il n'y a pas de méthode magique __get()/__set(), le pointeur est implicitement créé et renvoyé si la méthode __get() ou __set() existe. , cela entraînera l'échec de ce handle, obligeant le moteur à s'appuyer sur des appels read_property et write_property distincts
zval *read_dimension(zval *obj, zval *. idx, int tapez TSRMLS_DC)
read_dimension () et write_dimension() sont similaires aux read_property() et write_property() correspondants mais ils sont déclenchés lorsque l'objet est accédé sous forme de tableau à l'aide de la méthode $obj['idx'] ; . Si la classe de l'objet n'implémente pas l'interface ArrayAccess, le comportement par défaut est de déclencher une erreur ; sinon elle appelle les méthodes magiques offsetget($idx) ou offsetset($idx, $value).
zval *get( zval *obj TSRMLS_DC)
void set(zval *obj, zval *value TSRMLS_DC)
Lors de la définition ou de la récupération de la valeur d'un objet, la méthode get() ou set() sera appelée sur l'objet. L'objet lui-même est passé comme. le premier paramètre. Pour set, la nouvelle valeur est passée comme deuxième paramètre ; En fait, ces méthodes sont utilisées dans les opérations arithmétiques.
int has_property(zval *obj, zval *prop, int chk_type TSRMLS_DC)
Ce gestionnaire est appelé lorsque isset() est appelé sur un propriété de l'objet. Par défaut, le gestionnaire standard vérifie le nom de l'attribut spécifié par la prop. Si cet attribut n'est pas trouvé dans PHP 5.1.0 et que la méthode __isset() est définie, cette méthode sera appelée si la valeur du paramètre chk_type est 2. , alors seul l'attribut doit exister. Si la valeur de chk_type est 0, alors doit exister et ne doit pas être une valeur IS_NULL. Si la valeur de chk_type est 1, l'attribut doit exister et doit être une valeur autre que FALSE. : En PHP 5.0.x,
La signification de chk_type est cohérente avec le chk_type de has_dimension.
int has_dimension(zval *obj, zval *idx, int chk_type TSRMLS_DC)
Lors de l'appel de isset() lors du traitement d'un objet comme d'un tableau (tel que isset($obj['idx'])), ce processeur est utilisé par défaut. vérifier si l'objet est implémenté. Si l'interface ArrayAccess est implémentée, la méthode offsetexists($idx) est appelée. Si elle n'est pas trouvée (en référence à l'appel de offsetexists()), c'est la même chose que si la méthode offsetexists() n'était pas implémentée. et 0 est renvoyé. Sinon, si chk_type est 0, renvoie directement true(1). Un chk_type de 1 indique qu'il doit appeler la méthode offsetget($idx) de l'objet et tester la valeur de retour,
Renvoie TRUE(1) uniquement si la valeur n'est pas FALSE.
Ces deux méthodes lorsque vous essayez de décharger les propriétés d'un objet (ou lors de l'application d'unset() à un objet dans un tableau). Le gestionnaire unset_property() supprime la propriété de la table des propriétés standard (si elle existe) ou tente d'appeler la méthode __unset($prop) implémentée (php 5.1). . 0), unset_dimension() appelle la méthode offsetunset($idx) lorsque la classe implémente ArrayAccess.
HashTable *get_properties(zval *obj TSRMLS_DC)
Ce gestionnaire est en fait appelé lorsque la fonction interne utilise la macro Z_OBJPROP() pour lire une propriété de la table de propriétés standard. Gestion par défaut des objets PHP. Le processeur décompresse et. renvoie Z_OBJ_P(object)->properties, qui est une véritable table de propriétés standard.
union _zend_function *get_method(zval **obj_ptr char *method_name, int nom_méthode_len TSRMLS_DC)
Ce gestionnaire est appelé lors de l'analyse d'une méthode objet dans la table_fonction de la classe. Si la méthode n'existe pas dans la table_fonction principale, le gestionnaire par défaut renvoie un pointeur vers l'objet _call($. name, $args) méthode enveloppée zend_function * pointer.
int call_method(char *method, INTERNAL_FUNCTION_PARAMETERS)
La fonction définie comme type ZEND_OVERLOADED_FUNCTION sera exécutée en tant que processeur call_method. Par défaut, ce processeur n'est pas défini.
union _zend_function *get_constructor(zval). *obj TSRMLS_DC)
Similaire au processeur get_method(), ce processeur renvoie une méthode d'objet correspondante. Référence Le constructeur dans le zend_class_entry de la classe est stocké dans. d'une manière spéciale, ce qui la rend spéciale. Le remplacement de cette méthode est très rare.
Semblable à get_constructor(), ce processeur est rarement surchargé. Son but est de mapper une instance d'objet et de revenir à sa définition de classe d'origine.
<🎜. >
int get_class_name(zval *object, char **name zend_uint *len, int parent TSRMLS_DC)
get_class_entry() est une étape de get_class_name(). Après avoir obtenu le zend_object de l'objet, il utilisera le nom de classe de l'objet ou son nom de classe parent (cela dépend de la valeur du paramètre parent ), fera une copie et retournera la copie renvoyée du nom de classe. utiliser un stockage non persistant (emalloc()).
int compare_objects(zval *obj1, zval * obj2 TSRMLS_DC)
Lorsque des opérateurs de comparaison (tels que : ==, !=, <=, <, >, >=) sont utilisés Lorsqu'il y a deux objets, appeler compare_objects() sur le Les opérandes (les deux objets participant à la comparaison) constituent la première partie de ce travail. Sa valeur de retour est généralement 1, 0, -1, ce qui représente respectivement supérieur à, égal à et inférieur à. Par défaut, les objets sont comparés en fonction. sur leurs tables attributaires standard, en utilisant les mêmes règles de comparaison que les règles de comparaison de tableaux apprises au chapitre 8, "Travailler avec des tableaux et des tables de hachage".
int cast_object( zval *src, zval *dst, int type, int Should_free TSRMLS_DC)
Lorsque vous essayez de convertir l'objet en un autre type de données, ce processeur sera déclenché. Si Should_free est défini sur une valeur non nulle, zval_dtor() sera appelé à l'heure d'été, libérant d'abord les ressources internes. En bref, le processeur devrait essayer de représenter l'objet dans src comme dst à Out du type zval *. Ce gestionnaire n'est pas défini par défaut, mais lorsqu'il est présent, il doit renvoyer SUCCESS ou FAILURE.
int count_elements (zval *obj, long *count TSRMLS_DC)
Les objets qui implémentent l'accès au tableau doivent définir ce gestionnaire, qui définira le nombre actuel d'éléments dans le nombre et retournera SUCCÈS si l'instance actuelle n'implémente pas le tableau. accès, il doit renvoyer FAILURE pour que le moteur revienne en arrière et vérifie la table d'attributs standard.
Annotation : la table de poignées ci-dessus et le php-5.4.9 utilisé par le traducteur n'est plus complètement cohérent. Lors de l'étude de cette partie, les lecteurs peuvent se référer au tableau des poignées de processeur standard en bas de Zend/zend_object_handlers.c.
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn