6blog
Accueil du site > Tutoriaux > La surcharge de fonctions

La surcharge de fonctions

mardi 8 avril 2008

Qui n’a jamais voulu créer deux fonctions différentes mais avec un profil relativement proche ( même nom, mais le dernier paramètre serait un entier supplémentaire par exemple) ou alors a défini maladroitement la même fonction dans plusieurs fichiers mais décide de modifier son profil ?

Il existe pour cela plusieurs méthodes qui dépendent majoritairement de la structure que vous employez.

  Appel de fonction classique

Cette solution consiste à créer une fonction sans paramètres ( ou avec uniquement les arguments communs à la fonction de base et ses éventuelles surcharges ) et d’appliquer un traitement différent en fonction du nombre d’arguments passés en paramètres grâce aux fonctions : func_get_args() et func_num_args()

Exemple de fonction à nombre d’argument variable On veut récupérer le plus grand nombre parmi les paramètres fournis à la fonction si leur nombre est pair, ou le plus petit si leur nombre est impair.

<?php
function minMaxFromValue(){
    
$argsCount func_num_args();
    
$argsList func_get_args();
    
$selected $argsList[0];
    for(
$i=1;$argsCount;$i++)
        if( 
$argsCount%2==
            
$args[$i] > $selected :
            
$args[$i] < $selected )
                
$selected $args[$i];
    return 
$selected;
}
?>

On peut donc influencer le comportement d’une fonction à travers son nombre d’argument.

Une autre méthode plus simple consiste à positionner des arguments à des valeurs par défaut dans le cas où ils ne sont pas spécifiés.

Exemple de fonction à argument par défaut Un exemple sur les pizzas.

<?php

$nb_pizza 
0;

function 
ajouter_pizza($action '',$nb 1){
    
    global 
$nb_pizza;
    
    switch(
$action){
    
    case 
'affichage':
    echo 
'Nombre de pizza actuel : '.$nb_pizza.'<br>';
    break;
    
    case 
'envoyer':
    
$nb_pizza $nb_pizza $nb;
    echo 
'Il reste encore '.$nb_pizza.' pizza(s)<br>';
    break;
    
    case 
'':
    
$nb_pizza $nb_pizza $nb;
    break;
    
    }
}

ajouter_pizza('',3); // ajoute 3 pizza
ajouter_pizza('affichage'); // affiche les pizzas
ajouter_pizza(); // ajoute 1 pizza ( valeur par défaut)
ajouter_pizza('affichage'); // affiche les pizzas
ajouter_pizza('envoyer'2); // Enlève 2 pizzas et affiche le nombre restant
?>

++++

  Appel de méthode d’objet

En Php5, on peut récupérer les appels de méthodes et traiter les informations d’une façon différente grâce à la méthode __call() qui s’occupera de gérer les appels aux fonctions inexistantes.

Exemple avec __call()

<?php
class Pizzeria {

    private 
$pizzaCounter 0;
    private 
$pizzaStorage = array();

    public function 
__call($name$args) {
        
// Si la méthode appelée s'appelle 'modifyPizza'
        
if( $name == 'modifyPizza' ){
            
$argsCount count$args );
            
// Si il y a un argument passé à la fonction
            
if( $argsCount == ){
                
// On va ajouter une pizza
                
return call_user_func_array(array(&$this'addPizza'), $args);
            
// Si il y'en a deux
            
} else if( $argsCount == ){
                
// On va modifier le nom d'une pizza
                
return call_user_func_array(array(&$this'modifyPizzaName'), $args);
            }
        }
    }
    
    public function 
addPizza($name){
        
$this -> pizzaStorage[$name] = (int)$this -> pizzaStorage[$name] + 1;
    }
    
    public function 
modifyPizzaName($oldName$newName){
        
// On récupère le nombre de pizza anciennement nommée oldName
        
$pizzaStock = (int)$this -> pizzaStorage[$oldName];
        
// On supprime l'entrée correspondante
        
unset($this -> pizzaStorage[$oldName]);
        
// On créé la nouvelle entrée
        
$this -> pizzaStorage[$newName] = $pizzaStock;
    }
    
}

$pizzeria = new Pizzeria();
$pizzeria -> modifyPizza('Pizza aux 4 fromages'); // on créé un stock de 1 pour les "Pizza aux 4 fromages"
$pizzeria -> modifyPizza('Pissaadiè'); // on créé un stock de 1 pour les "Pissaadiè"
// Mais on a fait une faute on décide de changer le nom
$pizzeria -> modifyPizza('Pissaadiè''Pissaladière'); // on change le nom des "Pissaadiè" en "Pissaladière"
?>

  Surchage de getter et setter

De la même manière il est possible de surcharger les getters et setters d’une classe par la définition des méthodes __get() et __set() qui vont automatiquement attraper les fonctions get**** et set**** si elles n’existent pas. Ensuite en jouant sur le nom de la fonction appelée ou le nombre d’argument, on peut facilement créer des profile de fonction différent.

La surcharge de méthode prend un aspect différent des autres langages et s’affiche plus comme étant une liste de méthode de substitution et non de réel surcharge.

  Le gestionnaire d’erreur de PHP

Il est possible également de redéfinir un gestionnaire en php et de récupérer les erreurs liés à un appel de fonction pour effectuer un autre traitement puis de continuer le reste de l’exécution du script.

Ceci sera plus détaillé dans un article sur les gestions d’erreurs en PHP

10 Messages de forum

  • La surcharge de fonctions 9 mars 2012 07:32, par GPZumYDxUQNDGoDVmSm

    It’s interesting that you meitsate the salary of staff at $75K a year, financial coaches at $50K a year, but the folks out getting dirty, doing physical labor at ONLY $20 a week !What if you rethink your numbers If there is only enough left over revenue for five weeks of actual work by the laborers, why calculate a full year of salary for the paper pushers ?

    Répondre à ce message

    • La surcharge de fonctions 7 juin 2012 09:35, par IJcUWHso

      Un potojuillet 19, 2011 Salut jaivas le meme probleme qu’indique dans mes commentaires. Cad un crash de gpsphone ou l’on revient au sprigboard. Eh bien c’est a cause du jailbreak il faut re-jailbreak l’iphone avec greenpoison rc6. Les anciennes versions du jailbreak greenpoison untethered bloquaient gpsphone ainsi que d’autres fonctionnalites mais la version rc6 repare tout. Essayez ca prends 2secondes a rejailbreak et vous ne perdez rien

      Répondre à ce message

      • La surcharge de fonctions 20 août 2012 00:38, par XIkBPZKqFbqwAXsfxyY

        Same with me I jailbroke with groinpees0n before and with spirit although spirit for me was tethered and I jailbroke with jailbreakme also but I hated groinpees0n buying really wanted to jailbreak again so I did and I have a 2nd generation iPod touch 8GB which doesn’t matter and I’m on 4.2.1 with an MC model and as soon as I install cydia I lose all my main apps

        Répondre à ce message

      • La surcharge de fonctions 22 août 2012 08:07, par LmvykBaO

        you have to download the sfpcieic greenpoison version for your IOS(your ipod software)i had this problem with a 4.1ios on iphone 3gs.I did a jailbreak wanted to start cydia but it crashed immediately.now everything works perfect. if you want to be sure your cydia works use redsn0w.

        Répondre à ce message

    • La surcharge de fonctions 12 juillet 2012 16:04

      rentre chez toi toca

      Répondre à ce message

      • La surcharge de fonctions 20 août 2012 00:47, par aqgsRDPTKBAvNqkY

        atlantis21 dit : atlantis21Bonjour,un truc bizrare en pptp avec le routeur et tout fonctionne quand je rebascule le routeur en classique et que sur le pc j’active vpnguardiana0 pour connecter cela n’est pas possible cela marche plus un peu bizrare je trouve avez vs le meame proble8me ou est ce qu’il y a une manip ou un port e0 ouvrir sur le routeur en plus car je sais que j’ai des ports attribue9s mais e7a c’est pour le p2p par exAutre chose est ce que quelqu’un a essaye9 sur un routeur en wifi n type wrt610n pour voir si cela fonctionne avec le tuto en pptp ou open vpn peut importeMerci e0 vous

        Répondre à ce message

        • La surcharge de fonctions 2 novembre 2012 00:27, par olhCxqOzGxQPwcjos

          valorisa dit : valorisaOn peut garedr son routeur actuel et le mettre en mode bridge et ainsia0le chaeenera0avec celui qui posse8de le firmware open source ou alors remplacer le routeur actuel par celuia0avec le firmware open source. Je ferai des essais avant de prendre une de9cision ferme.a0Les fichiers ca.crt, user.crt et user.key sont indispensables pour l’installation sur le routeur. Ils doivent eatre pre9sents chez tout fournisseur de VPN qui propose une solution de chiffrement via SSL/TLS (OpenVPN). Bien sfbr leur nom (leur pre9fixe) diffe8re d’un fournisseur VPN e0 l’autre.

          Répondre à ce message

          • La surcharge de fonctions 4 février 21:28, par AGynRXVgooFYViVCRUg

            valorisa dit : valorisaSi tu perdns par exemple le routeura0ASUS RT-N16, il a un processeur de 533 MHz, 128 Mo de RAM et 64 Mo de me9moire flash. De plus il date de 2009. C’est plus que suffisant pour ce e0 quoi on le destine (du VPN notamment). Effectivement e0 cf4te9 le WRT54G date un peu. Tu peux conserver ton routeur actuel ou le remplacer par un mode8le compatible DD-WRT.

            Répondre à ce message

    • La surcharge de fonctions 4 décembre 2012 16:55, par Shemeka

      Je désirais encenser votre engagement dans la mise en commun de vos connaissances et l’exactitude de ce site internet.

      assurance santé credit mutuelmutuelle du varassurance santé geneve - mutuelle senior - assurance santé n°3 cout assurance santé québec mutuelle generation complémentaire santé pas cher

      Répondre à ce message

Répondre à cet article

SPIP | squelette | | Plan du site | Suivre la vie du site RSS 2.0