web-dev-qa-db-fra.com

Que signifie "return $ this"?

J'essaie de comprendre ce code, et quand je suis arrivé à la dernière ligne, je ne l'ai pas compris. :(

Puis-je avoir votre aide pour savoir ce que signifie return $this?

public function setOptions(array $options) {
    $methods = get_class_methods($this);
    foreach ($options as $key => $value) {
        $method = 'set' . ucfirst($key);
        if (in_array($method, $methods)) {
            $this->$method($value);
        }
    }

    //???? - return what ?
    return $this;
}

Mettre à jour:
J'ai supprimé mes commentaires pour une meilleure clarification.

26
MEM

Cette façon de coder s'appelle interface fluide . return $this renvoie l'objet actuel, vous pouvez donc écrire le code suivant:

$object
  ->function1()
  ->function2()
  ->function3()
  ;

au lieu de:

$object->function1();
$object->function2();
$object->function3();
60
Maerlyn

Cela renverra l'instance sur laquelle cette méthode est appelée. Ceci est généralement fait pour obtenir des interfaces fluides afin que vous puissiez appeler des choses comme:

CoolClass::factory('hello')->setOptions(array('coolness' => 5))->sayHello();

setOptions et sayHello seraient appelés sur le même objet.

6
Jakub Hampl

$this désigne l'objet actuel, celui sur lequel la méthode est en cours d'exécution. En renvoyant $this une référence à l'objet en cours de travail, la méthode est renvoyée à la fonction appelante.

Donc, quiconque fait 

 $foo2 = $foo->SetOptions($bar);

$ foo2 se réfère maintenant à $ foo également.

5
Doug T.

$ ce serait la classe qui contient cette fonction.

Donc, si vous appelez comme ça:

$obj->setOptions($options)

il retournera $ obj, qui a été défini avec les nouvelles options. Généralement, lorsque quelque chose est défini comme ceci, vous n'avez pas à capturer le retour, car cela affecte l'objet lui-même, mais cela permet de l'utiliser en ligne.

4
John

vous pouvez juste créer une chaîne de fonctions

class My_class
{

        public function method1($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

        public function method2($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

        public function method3($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

}

donc tu peux utiliser ça

            My_class obj = new My_class();

            $return = obj->method1($param)->method2($param)->method3($param);
2

Si la méthode SetOptions fait partie d'une classe ProgramOptions ou de quelque chose, $ ceci fera référence à la classe contenant la méthode, de sorte que vous renverriez une instance de ProgramOptions.

1
CodeMinion

C’est une technique courante OOP appelée Interface courante . Son objectif principal est d’aider à chaîner plusieurs appels de méthodes dans des langages qui ne prennent pas en charge les méthodes en cascade, comme PHP. Alors 

return $ this;

retournera une instance mise à jour (objet) de cette classe afin qu'elle puisse effectuer un autre appel dans sa portée. Voir exemple en PHP,

class Class_Name {
    private field1;
    private field2;
    private field3;

    public function setField1($value){

        $this->field1 = $value;

        return $this; 
    }

    public function setField2($value){

        $this->field2 = $value;

        return $this; 
    }

    public function setField3($value){

        $this->field3 = $value;

        return $this; 
    }
} 

$object = new Class_Name();
$object->setField1($value1)->setField2($value2)->setField3($value3);
0
Steve Junior