Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Конкструкции вида class::method->something


Автор: kkashicyn 29.12.2010, 12:18
Доброго времени суток!
Не могу разобраться с синтаксисом ООП в PHP:

как рассматривать конструкции вида, что они означают

Код

class::method()->something или

$obj->view->two->free




Автор: Shogun 29.12.2010, 12:32
1. http://www.php.ru/manual/language.oop5.static.html
2. http://cowburn.info/2007/09/19/php5-method-chaining/
http://www.iinuu.lv/ru/?id=259

Автор: kkashicyn 29.12.2010, 12:38
С методами в принципе разобрался.

а вот тут объекты в объекте?

Код

$obj->view->two->free

Автор: Shogun 1.1.2011, 16:28
Цитата
а вот тут объекты в объекте?
 агась

Код

class Obj
  {
    public $view;

    public function __construct()
      {
         $this->view = new View();
      }
  }

class View
  {
    public $two;

    public function __construct()
      {
         $this->two= new Two();
      }
  }

class Two
  {
    public $three = 'This is class Three.';
  }

$obj = new Obj();

echo $obj->view->two->three;

#и как результат выведет 
This is class Three.


Автор: lumentek 3.1.2011, 02:01
А как узнать первому методу (в цепочке) то что за ним идет цепочка других методов до указание в этом методе return $this;
Тоесть например я в одном случае хочу вызвать $class->first_method() и получить конкретное значение, а в другом случае хочу использовать в этом же проекте цепочке $class->first_method()->second_method();

Автор: skyboy 3.1.2011, 10:38
Цитата(lumentek @  3.1.2011,  01:01 Найти цитируемый пост)
А как узнать первому методу (в цепочке) то что за ним идет цепочка других методов до указание в этом методе return $this;

без return'a никак. никто не "знает, что дальше идет цепочка вызовов". нету такого отдельного механизма, как "цепочка вызовов", это просто код выглядит так.
на самом деле, код работает абсолютно так же, как и 
Код

($object->first_method())->second_method()

или
Код

var $temp = $class->first_method();
$temp->second_method();

потому нет return(не обязательно $this; любое необходимое значение, являющееся объектом) - нет возможности циклического вызова методов.
а что, сложно написать return $this?  smile 

Автор: lumentek 3.1.2011, 17:46
Нет,  я имею ввиду другое.

Например есть класс FilesUpload, у которого есть метод getArrFile(), который возвращает массив такой же как и $_FILES (tmp_name, name, size итд).
И есть отдельные методы, возвращающий нужный елемент этого массива, например  getTmpName()

Например $cls = new FilesUploads();
$arrFile = $cls->getArrFile()->getTmpName();

Как сделать так чтобы если вызвали просто метод getArrFile(), то он вернул массив, а если использовали метод сцепления, то он вернул соответсвующий элемент?

Автор: perloid 3.1.2011, 20:05
Цитата(lumentek @ 3.1.2011,  17:46)
Нет,  я имею ввиду другое.

Например есть класс FilesUpload, у которого есть метод getArrFile(), который возвращает массив такой же как и $_FILES (tmp_name, name, size итд).
И есть отдельные методы, возвращающий нужный елемент этого массива, например  getTmpName()

Например $cls = new FilesUploads();
$arrFile = $cls->getArrFile()->getTmpName();

Как сделать так чтобы если вызвали просто метод getArrFile(), то он вернул массив, а если использовали метод сцепления, то он вернул соответсвующий элемент?

Реализовать интерфейс ArrayAccess
http://php.net/manual/en/class.arrayaccess.php

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)