IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] PHP est il polymorphique ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Par défaut [POO] PHP est il polymorphique ?
    Bonjour,

    Tout est dans le titre.

    a+

  2. #2
    Membre éclairé Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Par défaut
    très souvent google est ton ami
    il suffit de bien le nourrir
    http://www.devshed.com/c/a/PHP/PHP-5-and-Polymorphism/
    etc.

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Pour répondre en clair, en effet PHP n'est pas polymorphique au sens traditionnel du terme (plusieurs fonctions avec des noms identiques mais des signatures différentes).

    Pourtant, fondamentalement, le polymorphisme est le principe de pouvoir appeler la même fonction ou méthode avec paramètres qui peuvent être différents aussi bien en nombre qu'en type. En ce sens, PHP est polymorphique à l'extrême puisque le type n'existe pas, et que le nombre de paramètres est potentiellement dynamique. Il n'est pas nécessaire en PHP de déclarer les paramètres dans la déclaration d'une fonction, puisqu'on peut récupérer tous les paramètres envoyés lors de l'appel à la fonction. Si je déclare une fonction avec 2 paramètres, rien ne m'empêche de l'appeler avec 7 paramètres et de tous les utiliser... Oui, PHP le permet

    Pour le nombre variable de paramètres selon l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    function foo($param1, $param2)
    {
        echo func_num_args().'<br/>';
    }
     
    foo(1, 2, 3);
    foo(1, 2, 3, 4, 5, 6, 7);
    foo(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
    Bien entendu, puisque PHP est un langage à types dynamiques, il est aussi possible de donner à une fonction des paramètres de type différent selon l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    function bar($param)
    {
        echo gettype($param).'<br/>';
    }
     
    bar(1);
    bar('deux');
    bar(new stdClass());
    Ce qui, si on mélange les deux principes à l'extrême, peut devenir quelque chose d'imbuvable comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <?php
    function foobar()
    {
        $params = func_get_args();
        $types = array();
        foreach($params as $name => $value)
        {
            if(is_null($value))
            {
                $types[$name] = 'null (pas de type)';
            }
            elseif(is_object($value))
            {
                $types[$name] = 'objet de classe '.get_class($value);
            }
            elseif(is_array($value))
            {
                $types[$name] = 'tableau de '.count($value).' éléments';
            }
            elseif(is_resource($value))
            {
                $types[$name] = 'ressource '.get_resource_type($value);
            }
            elseif(is_scalar($value))
            {
                if(is_bool($value))
                {
                    $types[$name] = 'booléen';
                }
                elseif(is_numeric($value))
                {
                    if(is_int($value))
                    {
                        $types[$name] = 'entier';
                    }
                    elseif(is_float($value))
                    {
                        $types[$name] = 'flottant';
                    }
                    else
                    {
                        $types[$name] = gettype($value);
                    }
                }
                elseif(is_string($value))
                {
                    if(function_exists($value))
                    {
                        $types[$name] = 'fonction';
                    }
                    elseif(is_dir($value))
                    {
                        $types[$name] = 'répertoire';
                    }
                    elseif(is_file($value))
                    {
                        if(is_executable($value))
                        {
                            $types[$name] = 'fichier exécutable';
                        }
                        elseif(is_link($value))
                        {
                            $types[$name] = 'lien système';
                        }
                        else
                        {
                            $types[$name] = 'fichier standard';
                        }
                    }
                    else
                    {
                        $types[$name] = gettype($value);
                    }
                }
            }
            else
            {
                $types[$name] = gettype($value);
            }
        }
     
        echo'<pre>'.print_r($types, TRUE).'</pre>';
    }
     
    foobar(1, 'deux', new stdClass());
    foobar('un', new stdClass(), 3);
    foobar(__FILE__, dirname(__FILE__), 'foobar');
    foobar(fopen(__FILE__, 'r'));

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Ce qui, si on mélange les deux principes à l'extrême, peut devenir quelque chose d'imbuvable
    Certaines personnes de mon entourage pensent que ce genre de procédé rend les fonctions plus permissives et évolutives.

    Du coup, elles sont bien les seules à pouvoir travailler sur ces fonctions qui, à la moindre modification de travers, fait péter toute l'application. Le polymorphisme, oui, mais à petites doses ...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    l'autre inconvénient est que comme php n'offre pas de syntaxe standard pour cela (comme les accesseurs/mutateurs -__get/__set- d'une classe), et bien aucun IDE ne le prend en charge.
    Cela à donc tendance à compliquer le développement.

Discussions similaires

  1. [POO] PHP 5 - gestion de la persistance
    Par BRAUKRIS dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2010, 13h34
  2. [POO] C'est quoi une classe en claire...???
    Par Spack dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 26/01/2009, 15h53
  3. [POO] [PHP 5 CLASSES]Source à part?
    Par Jean_Benoit dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2005, 11h50
  4. [POO] PHP et la gestion des classes
    Par Acti dans le forum Langage
    Réponses: 7
    Dernier message: 23/09/2005, 00h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo