POO et php : je suis un peu perdu avec la « surcharge »

Le problème exposé dans ce sujet a été résolu.

Salut à tous !

J’ai connu l’orienté objet où la surcharge, habituellement, fournit la possibilité d’avoir plusieurs méthodes portant le même nom mais avec une quantité et des types différents d’arguments. En php, cela ne fonctionne pas.

Cependant, j’ai besoin de la surcharge appliquée à mon constructeur, un peu comme ceci :

class ObjetBizarre
{
    private $_a;
    private $_b;

    public function __construct($i, $j)
    {
        if (is_int($i) && is_int($j))
        {
            $_a = $i;
            $_b = $j;
        }
    }

    public function __construct($m)
    {
        if (is_string($m))
        {
            $m = explode('|', $m);

            $_a = $m[3];
            $_b = $m[4];
        }
    }
}

Le code résume l’un de mes projets.

Comment faire fonctionner ce code en php ?

D’accord, et est-ce une bonne pratique d’écrire un code un peu comme ceci :

class ObjetBizarre
{
    private $_a;
    private $_b;

    public function __construct($m, $j = 0)
    {
        if (is_string($m))
        {
            $m = explode('|', $m);

            $_a = $m[3];
            $_b = $m[4];
        }
        else if (is_int($m) && is_int($j) && $j > 0)
        {
            $_a = $m;
            $_b = $j;
        }
    }   
}

Salut,

Malheureusement, ce n’est pas possible en PHP, deux méthodes d’une même classe ne peuvent pas porter le même nom, même avec une signature différente :(

Tu peux contourner ce problème en définissant un seul constructeur, dont le second paramètre est déclaré facultatif, comme ceci :

public function __construct($i, $j = null)

Ensuite, comme tu l’as fait dans ton code, tu vérifies le type de $i et, si c’est un nombre, tu vérifies également que $j est défini (non null) et un nombre également.

Petit conseil : si tu en as la possibilité, pense à migrer au moins sur PHP 7.1, cela te permettra de vérifier directement dans la signature que tu reçois bien le bon type :

public function __construct($i, ?int $j = null)

Ainsi, si $j n’est pas null, alors ce sera forcément un nombre. Il ne te reste qu’à vérifier le type de $i manuellement ;)

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte