190 votes

Enchaînement de méthodes PHP ou interface fluide ?

J'utilise PHP 5 et j'ai entendu parler d'une nouvelle fonctionnalité de l'approche orientée objet, appelée "chaînage de méthodes". Qu'est-ce que c'est exactement ? Comment puis-je l'implémenter ?

1 votes

Je dirais que la plupart de ces questions, si ce n'est toutes, portent sur les aspects techniques du chaînage, alors que celle-ci porte plus spécifiquement sur la manière de le réaliser.

0 votes

@Kristoffer le PO aurait pu facilement trouver comment il est réalisé à partir de ces questions.

2 votes

@Kristoffer en outre, la recherche de enchaînement de méthodes php sur Google aurait donné au PO une tutoriel par Salathe comme tout premier résultat. Ça ne me dérange pas de répondre à des questions faciles, mais certaines personnes sont simplement trop paresseuses.

5voto

Lukas Dong Points 49

Il y a 49 lignes de code qui vous permettent de chaîner des méthodes sur des tableaux comme ceci :

$fruits = new Arr(array("lemon", "orange", "banana", "apple"));
$fruits->change_key_case(CASE_UPPER)->filter()->walk(function($value,$key) {
     echo $key.': '.$value."\r\n";
});

Consultez cet article qui vous montre comment enchaîner les soixante-dix fonctions array_ de PHP.

http://domexception.blogspot.fi/2013/08/php-magic-methods-and-arrayobject.html

5 votes

Il ne s'agit pas vraiment d'une réponse, mais plutôt d'un lien vers une page Web contenant une réponse potentielle.

3voto

Devsaiful Points 89

Une interface fluide permet de chaîner les appels de méthodes, ce qui permet de réduire le nombre de caractères typés lors de l'application de plusieurs opérations sur le même objet.

class Bill { 

    public $dinner    = 20;

    public $desserts  = 5;

    public $bill;

    public function dinner( $person ) {
        $this->bill += $this->dinner * $person;
        return $this;
    }
    public function dessert( $person ) {
        $this->bill += $this->desserts * $person;
        return $this;
    }
}

$bill = new Bill();

echo $bill->dinner( 2 )->dessert( 3 )->bill;

0voto

Biswajit Biswas Points 104

Je pense que c'est la réponse la plus pertinente.

<?php

class Calculator
{
  protected $result = 0;

  public function sum($num)
  {
    $this->result += $num;
    return $this;
  }

  public function sub($num)
  {
    $this->result -= $num;
    return $this;
  }

  public function result()
  {
    return $this->result;
  }
}

$calculator = new Calculator;
echo $calculator->sum(10)->sub(5)->sum(3)->result(); // 8

-1voto

JuanBruno Points 31

Voici mon modèle qui est capable de trouver par ID dans la base de données. La méthode with($data) est mon paramètre supplémentaire pour la relation, je retourne donc $this qui est l'objet lui-même. Sur mon contrôleur, je suis capable de le chaîner.

class JobModel implements JobInterface{

        protected $job;

        public function __construct(Model $job){
            $this->job = $job;
        }

        public function find($id){
            return $this->job->find($id);
        }

        public function with($data=[]){
            $this->job = $this->job->with($params);
            return $this;
        }
}

class JobController{
    protected $job;

    public function __construct(JobModel $job){
        $this->job = $job;
    }

    public function index(){
        // chaining must be in order
        $this->job->with(['data'])->find(1);
    }
}

-1voto

Dmitry Sheiko Points 101

Si vous voulez parler d'enchaînement de méthodes comme en JavaScript (ou jQuery pour certains), pourquoi ne pas prendre une bibliothèque qui apporte cette expérience de développement en PHP ? Par exemple Extras - https://dsheiko.github.io/extras/ Celui-ci étend les types PHP avec des méthodes JavaScript et Underscore et fournit un chaînage :

Vous pouvez enchaîner un type particulier :

<?php
use \Dsheiko\Extras\Arrays;
// Chain of calls
$res = Arrays::chain([1, 2, 3])
    ->map(function($num){ return $num + 1; })
    ->filter(function($num){ return $num > 1; })
    ->reduce(function($carry, $num){ return $carry + $num; }, 0)
    ->value();

ou

<?php
use \Dsheiko\Extras\Strings;
$res = Strings::from( " 12345 " )
            ->replace("/1/", "5")
            ->replace("/2/", "5")
            ->trim()
            ->substr(1, 3)
            ->get();
echo $res; // "534"

Vous pouvez également opter pour la polymorphie :

<?php
use \Dsheiko\Extras\Any;

$res = Any::chain(new \ArrayObject([1,2,3]))
    ->toArray() // value is [1,2,3]
    ->map(function($num){ return [ "num" => $num ]; })
    // value is [[ "num" => 1, ..]]
    ->reduce(function($carry, $arr){
        $carry .= $arr["num"];
        return $carry;

    }, "") // value is "123"
    ->replace("/2/", "") // value is "13"
    ->then(function($value){
      if (empty($value)) {
        throw new \Exception("Empty value");
      }
      return $value;
    })
    ->value();
echo $res; // "13"

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