Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation de la valeur de retour de la fonction personnalisée PHP

Explication détaillée de l'utilisation de la valeur de retour de la fonction personnalisée PHP

伊谢尔伦
伊谢尔伦original
2017-06-27 09:15:116332parcourir

Valeur de retour

Espace utilisateur La fonction utilise le mot-clé return pour renvoyer des informations à son espace appelant, ce qui est la même que la syntaxe du langage C .

Par exemple :

function sample_long() {  
  return 42;  
}  
$bar = sample_long();

Lorsque sample_long() est appelé, 42 est renvoyé et défini sur la variable $bar Le code équivalent en langage C est le suivant :

int sample_long(void) {  
  return 42;  
}  
void main(void) {  
  int bar = sample_long();  
}
Bien sûr, en langage C, vous savez toujours quelle est la fonction appelée, et elle est renvoyée en fonction du prototype de la fonction, vous devez donc définir la variable où le résultat renvoyé est stocké lorsqu'il est traité dans l'espace utilisateur PHP. , le type de variable est dynamique, comptez plutôt sur le type de zval introduit dans le chapitre 2 "Les tenants et les aboutissants des variables".

variable return_value

Vous pourriez penser que votre

fonction interne devrait renvoyer un zval directement, ou allouer de l'espace mémoire à un zval et renvoyer zval *.

PHP_FUNCTION(sample_long_wrong)  
{  
    zval *retval;  
      
    MAKE_STD_ZVAL(retval);  
    ZVAL_LONG(retval, 42);  
      
    return retval;  
}
Malheureusement, cela est incorrect. Il n'est pas obligatoire pour chaque fonction d'allouer un zval et de le renvoyer. . Au lieu de cela, le moteur Zend pré-alloue cet espace avant l'appel de la fonction. Initialisez ensuite le type de zval à IS_NULL et transmettez la valeur comme nom de paramètre return_value :

PHP_FUNCTION(sample_long)  
{  
    ZVAL_LONG(return_value, 42);  
    return;  
}
. Soyez prudent De plus, l'implémentation de PHP_FUNCTION() ne renvoie directement aucune valeur. Au lieu de cela, les données appropriées sont insérées directement dans le paramètre return_value, et le moteur Zend les traitera après l'exécution de la fonction interne

. Rappel amical : ZVAL_LONG La macro () est une encapsulation de plusieurs opérations d'affectation :

Z_TYPE_P(return_value) = IS_LONG;  
Z_LVAL_P(return_value) = 42;
ou plus directement :

return_value->type = IS_LONG;  
return_value->value.lval = 42;
les attributs is_ref et refcount

de return_value devraient non modifié directement par les fonctions internes. Ces valeurs sont initialisées et traitées par le moteur Zend lors de l'appel de votre fonction.

Jetons maintenant un œil à cette fonction spéciale et ajoutons-la au chapitre 5 "Votre premier dans le exemple d'extension créé dans "Extension". Ajoutez simplement cette fonction sous la fonction sample_hello_world() et ajoutez sample_long() à la structure php_sample_functions

 :

static function_entry php_sample_functions[] = {  
    PHP_FE(sample_hello_world, NULL)  
    PHP_FE(sample_long, NULL)  
    { NULL, NULL, NULL }  
};
Maintenant, vous pouvez exécuter make pour reconstruire l'extension.

Si tout est OK, vous pouvez exécuter php et tester la nouvelle fonction :

$ php -r 'var_dump(sample_long());

Encapsulation de macros plus compactes

En termes de lisibilité et de maintenabilité du code, il y a des parties répétées dans la macro ZVAL_*() : variable return_value Dans ce cas, remplacez le ZVAL de la macro par RETVAL, nous pouvons omettre return_value. lors de l'appel.

Dans l'exemple précédent, le code d'implémentation de sample_long() peut être réduit à ce qui suit :

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