[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оператор ->
Avner
Осваиваю понемногу ООП. Но из-за непонимания некоторых мелочей никак не складывается целостная картинка. Например, вот объясните мне, что означает строчка кода:
PHP
$obj->methodOne()->methodTwo();

думал, что это равносильно:
PHP
$obj->methodOne();
$obj->methodTwo();

но нет же, а что тогда?
Спасибо.



Спустя 10 минут, 30 секунд (8.10.2009 - 11:07) glock18 написал(а):
PHP
class MyClass
{
  private 
$var 'Hello';
  public function 
methodOne()
  {
    
$this->var 'Hello one';
    echo 
$this->var;
    return 
$this;
  }

  public function 
methodTwo()
  {
    
$this->var 'Hello two';
    echo 
$this->var;
    return 
$this;
  }
}


вот здесь можно будет вызвать
PHP
$obj = new MyClass();
$obj->methodOne()->methodTwo();


и эффект будет тот же, что от

PHP
$obj = new MyClass();
$obj->methodOne();
$obj->methodTwo();


но это только лишь потому, что methodOne возвращает сам объект.

В общем случае, обращение по -> делается к методу или свойству объекта. И метод может возвращать любой объект (не только $this, но и совершенно другой). как здесь:

PHP
class MyClass
{
  private 
$var 'Hello';
  private 
$another null;
  public function 
methodOne()
  {
    
$this->var 'Hello one';
    echo 
$this->var;
    if (
$this->another === null)
    {
      
$this->another = new MyAnotherClass();
    }
    return 
$this->another;
  }

  public function 
methodTwo()
  {
    
$this->var 'Hello two';
    echo 
$this->var;
    return 
$this;
  }
}

class 
MyAnotherClass
{
  private 
$var 'Another Hello';
  public function 
methodTwo()
  {
    echo 
$this->var;
  }
}


запусти с выше указанными классами то, что указано выше, и ты увидишь различия smile.gif

Спустя 38 минут, 5 секунд (8.10.2009 - 11:45) Avner написал(а):
Теперь понял, спасибо. Это у вас во 2-ом случае MyClass паттерн "фабрику" реализует? И еще вопрос. Как по вашему. Это хороший стиль сокращать:
PHP
$obj->m1();
$obj->m2();
$obj->m3();

до:
PHP
$obj->m1() ->m2()->m3();

Или все-таки такую запись лучше использовать в других случаях (как у вас в примере)?

Спустя 11 минут, 16 секунд (8.10.2009 - 11:56) glock18 написал(а):
Цитата
Это у вас во 2-ом случае MyClass паттерн "фабрику" реализует?


как сказать) нет вообще то, но есть зачатки и фабрики и синглтона. они оба реализуются и использованием такого фрагмента.

насчет стиля воздержусь. есть такой стиль, когда методы setter'ы (те что не возвращают значение, а устанавливают) возвращают сам объект. Это используется в jQuery, например. Так вот как раз для того, чтобы над одним объектом выполнять ряд действий через

$('#someblock').animate().hide()... так далее

там все это понятно интуитивно - все эти действия выполнятся в таком порядке.

в применении к php тоже можно такое сделать, но смысла в этом меньше.

лично я редко использую такие конструкции

PHP
$obj->setSmth()
      ->
setSmth2()
      ->
setSmth3();

Спустя 10 минут, 30 секунд (8.10.2009 - 12:07) glock18 написал(а):
Поправлюсь немного:
последнюю конструкцию я не использую в случае, если объект возвращает себя. в случае, если возвращает другой объект, то я наоборот почти всегда использую такую запись.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.