Что значит «вернуть $ это»? - PullRequest
26 голосов
/ 11 мая 2011

Я пытаюсь понять этот код, и когда я дошел до последней строки, я не понял его.: (

Могу ли я получить вашу помощь, чтобы узнать, что означает 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;
}

Обновление:
Я удалил свои комментарии для лучшего разъяснения.

Ответы [ 7 ]

60 голосов
/ 11 мая 2011

Этот способ кодирования называется свободный интерфейс . return $this возвращает текущий объект, поэтому вы можете написать такой код:

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

вместо:

$object->function1();
$object->function2();
$object->function3();
6 голосов
/ 11 мая 2011

Это вернет экземпляр, для которого вызывается этот метод. Обычно это делается для достижения плавных интерфейсов , чтобы вы могли вызывать такие вещи, как:

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

Где setOptions и sayHello будут вызваны для одного и того же объекта.

5 голосов
/ 11 мая 2011

$this означает текущий объект, который используется в данный момент.Возвращая $this ссылку на объект, с которым работает метод, отправляется обратно в вызывающую функцию.

Таким образом, любой, кто делает

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

$ foo2, теперь также ссылается на $ foo.

4 голосов
/ 11 мая 2011

$ это будет класс, который содержит эту функцию.

Так что, если вы будете вызывать ее следующим образом:

$obj->setOptions($options)

, она вернет $ obj, который был установлен с новыми опциями.Обычно, когда что-то установлено так, вам не нужно захватывать возврат, потому что это влияет на сам объект, но делает так, чтобы вы могли использовать его встроенным.

2 голосов
/ 21 марта 2017

вы просто можете создать цепочку функций

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;
        }

}

так что вы можете использовать это

            My_class obj = new My_class();

            $return = obj->method1($param)->method2($param)->method3($param);
1 голос
/ 11 мая 2011

Если метод SetOptions является частью класса ProgramOptions или чего-то еще, $ this будет относиться к классу, содержащему метод, поэтому вы будете возвращать экземпляр ProgramOptions.

0 голосов
/ 15 апреля 2018

Это общая методика ООП, называемая Свободный интерфейс .Это основная цель, чтобы помочь объединить несколько вызовов методов в языках, которые не поддерживают каскадирование методов, таких как PHP.Поэтому

return $ this;

вернет обновленный экземпляр (объект) этого класса, чтобы он мог сделать еще один вызов в своей области видимостиСмотрите пример в 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);
...