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