4 votes

Est-il possible de surcharger en chaîne les constructeurs en PHP ?

C'est un exemple inventé, il devient beaucoup plus utile quand il y a beaucoup de paramètres.

Cela permettrait à l'appelant d'utiliser soit new Person("Jim", 1950, 10, 2) o new Person("Jim", datetimeobj) . Je connais les paramètres facultatifs, mais ce n'est pas ce que je recherche ici.

En C#, je peux le faire :

public Person(string name, int birthyear, int birthmonth, int birthday)
    :this(name, new DateTime(birthyear, birthmonth, birthday)){ }

public Person(string name, DateTime birthdate)
{
    this.name = name;
    this.birthdate = birthdate;
}

Puis-je faire une chose similaire en PHP ? Quelque chose comme :

function __construct($name, $birthyear, $birthmonth, $birthday)
{
    $date = new DateTime("{$birthyear}\\{$birthmonth}\\{$birthyear}");
    __construct($name, $date);
}

function __construct($name, $birthdate)
{
    $this->name = $name;
    $this->birthdate = $birthdate;
}

Si cela n'est pas possible, quelle est une bonne alternative ?

6voto

deceze Points 200115

Pour cela, j'utiliserais des constructeurs/facteurs nommés/alternatifs ou tout autre nom que vous voulez leur donner :

class Foo {

   ...

   public function __construct($foo, DateTime $bar) {
       ...
   }

   public static function fromYmd($foo, $year, $month, $day) {
       return new self($foo, new DateTime("$year-$month-$day"));
   }

}

$foo1 = new Foo('foo', $dateTimeObject);
$foo2 = Foo::fromYmd('foo', 2012, 2, 25);

Il devrait y avoir un constructeur canonique, mais vous pouvez avoir autant de constructeurs alternatifs que de wrappers de commodité qui renvoient tous au constructeur canonique. Vous pouvez également définir des valeurs alternatives dans ces constructeurs alternatifs que vous ne définissez pas habituellement dans le constructeur normal :

class Foo {

    protected $bar = 'default';

    public static function withBar($bar) {
        $foo = new self;
        $foo->bar = $bar;
        return $foo;
    }

}

1voto

Cheery Points 9929

Ce n'est pas exactement la même chose, mais vous pouvez manipuler le nombre d'arguments dans le constructeur, les compter ou vérifier leurs types et appeler les fonctions correspondantes. Par exemple :

class MultipleConstructor {
  function __construct() {
     $args =  func_get_args();
     $construct = '__construct' . func_num_args();
     if (method_exists($this, $construct))
        call_user_func_array(array($this, $construct), $args);  
  } 

  private function __construct1($var1)
  {
      echo 'Constructor with 1 argument: ' . $var1;
  }

  private function __construct2($var1, $var2)
  {
      echo 'Constructor with 2 arguments: ' . $var1 . ' and ' . $var2;
  }

}

$pt = new MultipleConstructor(1);
$pt = new MultipleConstructor(2,3);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X