Maison >développement back-end >tutoriel php >Une brève discussion du code source PHP 12 : à propos de la valeur de retour return_value

Une brève discussion du code source PHP 12 : à propos de la valeur de retour return_value

不言
不言original
2018-06-28 17:15:012013parcourir

Cet article introduit principalement une brève discussion sur le code source PHP 12 : concernant return_value, la valeur de retour a une certaine valeur de référence. Maintenant, je la partage avec vous. Les amis dans le besoin peuvent s'y référer

Lisez le. code source de PHP Depuis un certain temps, je sais que tant que vous utilisez PHP_FUNCTION dans une fonction d'extension et attribuez la valeur à return_value, vous pouvez renvoyer la valeur de cette fonction.
Ensuite, j'ai tracé le code moi-même. J'ai toujours pensé qu'il y avait une variable globale comme return_value ou une table de hachage globale contenant return_value, mais je ne l'ai jamais trouvée
Ce n'est que lorsque j'ai demandé à Brother. Niao aujourd'hui, j'ai soudain réalisé que Niao Brother avait dit dans l'e-mail : "return_value est un paramètre en PHP qui fournit la fonction PHP_FUCTION aux scripts PHP, développée par une macro. En copiant ce paramètre, ZE renverra la valeur à l'appel frontal script. "

La définition de la macro est la suivante :

 #define PHP_FUNCTION ZEND_FUNCTION#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC

Certaines fonctions intégrées (comme chacune) utilisent directement ZEND_FUNCTION
Les fonctions d'extension utilisent PHP_FUNCTION

Dans certaines fonctions d'extension, nous voyons souvent que certaines n'utilisent pas return_value, mais utilisent plutôt des macros contenant return_value.
Les macros courantes sont les suivantes :

  //    zend_API.h    500行开始
  #define ZVAL_FALSE(z)   ZVAL_BOOL(z, 0)#define ZVAL_TRUE(z)   ZVAL_BOOL(z, 1) 
  #define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l)
  #define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)
  #define RETVAL_NULL() ZVAL_NULL(return_value)
  #define RETVAL_LONG(l) ZVAL_LONG(return_value, l)
  #define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value, d)
  #define RETVAL_STRING(s, duplicate) ZVAL_STRING(return_value, s, duplicate)
  #define RETVAL_STRINGL(s, l, duplicate) ZVAL_STRINGL(return_value, s, l, duplicate)
  #define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)
  #define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
  #define RETVAL_FALSE   ZVAL_BOOL(return_value, 0)
  #define RETVAL_TRUE   ZVAL_BOOL(return_value, 1) 
  #define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }
  #define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
  #define RETURN_NULL() { RETVAL_NULL(); return;}
  #define RETURN_LONG(l) { RETVAL_LONG(l); return; }
  #define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }
  #define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; }
  #define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }
  #define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
  #define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
  #define RETURN_FALSE   { RETVAL_FALSE; return; }
  #define RETURN_TRUE   { RETVAL_TRUE; return; }

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour plus de contenu connexe, veuillez faire attention au chinois PHP. site web!

Recommandations associées :

Une brève présentation du code source PHP 11 : Introduction à array_key_exists, in_array

Une brève présentation à propos du code source PHP Dix : À propos des fonctions array_keys, array_values ​​​​

Brève discussion sur le code source PHP Neuf : Introduction à array_unshift, array_push

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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