web-dev-qa-db-fra.com

Fonction dans une fonction.

Ce code produit le résultat sous la forme 56.

function x ($y) {
    function y ($z) {
        return ($z*2);
    }

    return($y+3);
}

$y = 4;
$y = x($y)*y($y);
echo $y;

Une idée de ce qui se passe à l'intérieur? Je suis confus.

61
Posto

X revient (valeur +3), alors que Y retourne (valeur * 2)

Avec une valeur de 4, cela signifie (4+3) * (4*2) = 7 * 8 = 56.

Bien que les fonctions ne soient pas limitées dans leur portée (ce qui signifie que vous pouvez "imbriquer" les définitions de fonctions en toute sécurité), cet exemple particulier est sujet à des erreurs:

1) Vous ne pouvez pas appeler y() avant d'appeler x(), car la fonction y() ne sera en fait définie que lorsque x() aura été exécuté une fois. .

2) L'appel de x() à deux reprises entraînera PHP à redéclarer la fonction y(), entraînant une erreur fatale:

Erreur fatale: Impossible de redéclarer y ()

La solution à ces deux problèmes serait de scinder le code afin que les deux fonctions soient déclarées indépendantes les unes des autres:

function x ($y) 
{
  return($y+3);
}

function y ($z)
{
  return ($z*2);
}

C'est aussi beaucoup plus lisible.

91
Duroth
(4+3)*(4*2) == 56

Notez que PHP ne supporte pas vraiment les "fonctions imbriquées", comme défini uniquement dans l'étendue de la fonction parent. Toutes les fonctions sont définies globalement. Voir docs .

27
Lukáš Lalinský

Pas sûr de ce que l'auteur de ce code voulait réaliser. Définir une fonction dans une autre fonction ne signifie PAS que la fonction interne est uniquement visible dans la fonction externe. Après avoir appelé x() la première fois, la fonction y() sera également dans la portée globale.

16
Anti Veeranna

C'est un concept utile pour la récursivité sans propriétés statiques, référence, etc.:

function getReqursiveItems($id){
    $allItems = array();

    function getItemms($parent_id){
       return DB::findAll()->where('`parent_id` = $parent_id');
    } 

    foreach(getItems($id) as $item){
         $allItems = array_merge($allItems, getItems($item->id) );
    }

    return $allItems;
}
8
d.raev

Il est possible de définir une fonction depuis une autre fonction. la fonction interne n'existe pas tant que la fonction externe n'est pas exécutée.

echo function_exists("y") ? 'y is defined\n' : 'y is not defined \n';
$x=x(2);
echo function_exists("y") ? 'y is defined\n' : 'y is not defined \n';

Sortie

y n'est pas défini

y est défini

Chose simple, vous ne pouvez pas appeler la fonction y avant d'exécuter x

5
Nanhe Kumar

Votre requête est en 7 * 8

x(4) = 4+3 = 7 et y(4) = 4*2 = 8

que se passe-t-il lorsque la fonction x est appelée elle crée fonction y, elle ne l'exécute pas.

3
Mike Valstar