Правильное обращение к методам

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 2 декабря 2012 в 11:21
Не могу сообразить, ибо учусь только на чужом коде, как лучше делать и почему правильный подход не был организован сразу:
  1. $inPage = cmsPage::getInstance();
  2. $inPage->method();
или
  1. cmsPage::getInstance()->method();
или
  1. cmsPage::method();
Почему все методы нельзя сделать статичными? Или это неправильно?
#2 2 декабря 2012 в 12:26
Похапе вообще странный язык, поскольку позволяет очень много разногласий в коде. ИМХО, правильней будет что то типа
  1. $inPage->method();
Хотя не факт конечно что так правильней.
#3 2 декабря 2012 в 12:51

Почему все методы нельзя сделать статичными?

airy
Статические методы это методы, которые вернут одинаковые значения(или совершат какое-то действие) для всех объектов класса. Для них в описании метода указывается слово static. Эти методы можно использовать и без создания объекта класса. Внутри класса к ним можно обращаться как self::method(), извне Название_класса::method().
Не статические методы совершают какие-то действия только для определенного объекта класса. Внутри к ним обращаемся как this->method(), извне Объект->method().
$inPage = cmsPage::getInstance(); это обычная конструкция для инстанта. Мы обращаемся к статическому методу класса, который создает новый объект класса, своего рода такой конструктор класса.
Примерно так, своими словами.
Кстати, это ООП(объектно-ориентированное программирование). Используется не только в php, в любом нормальном языке программирования и дает большие возможности.

Не могу сообразить, ибо учусь только на чужом коде

Нужно разбирать чужой код, и что непонятно смотреть в учебниках(или на сайтах, посвященных языку). Тогда будет лучший результат. Как не крути, а матчасть придется изучать.
#4 2 декабря 2012 в 13:30
То есть это я так понимаю возвращает нам уже готовый объект(создался он при первом обращении) со всеми переменными и тд:
  1. $inPage = cmsPage::getInstance();
А вот так:
  1. cmsPage::method();
Можно обращаться к простым так сказать обработчикам чего либо, в которых не используется $this. Так?
#5 2 декабря 2012 в 17:04


То есть это я так понимаю возвращает нам уже готовый объект(создался он при первом обращении) со всеми переменными и тд:

  1. $inPage = cmsPage::getInstance();
А вот так:
  1. cmsPage::method();
Можно обращаться к простым так сказать обработчикам чего либо, в которых не используется $this. Так?

lokanaft


в первом случае если он уже создан то он получает его окружение, т.е грубо говоря параметры итп. Если не создан то создается.

во втором идет вызов статического метода класса cmsPage.

еще есть метод обращения такого типа:

  1.  
  2. $class = new TestClass(параметры конструктора);
  3.  
  4. $class->title('privet')->query();
  5.  
#6 2 декабря 2012 в 21:32
Есть объект класса, который включает все свои свойства — $inPage.

К обычным общедоступным методам класса обращаются через объект $inPage — $inPage->method();
Подразумевается, что в данном методе используются свойства объекта $inPage.
Если же в методе не используются никакие свойства объекта, его имеет смысл сделать статичным и обращаться к нему БЕЗ создания объекта класса. К статическим методам класса можно так же обращаться через объект, т.е. как $inPage->method(); так и cmsPage::method();, чего нельзя сделать с обычными методами.

еще есть метод обращения такого типа:

kir
есть, но при условии, что в вашем примере метод title() отдает объект класса TestClass или любой другой объект. Не очень наглядный пример на самом деле.
cmsPage::getInstance()->method();
так имхо яснее.

cmsPage::getInstance(); возвращается всегда один и тот же объект класса, т.н. паттерн Синглтон (Singleton).

— когда лучше использовать $inPage = cmsPage::getInstance();
— когда далее по коду много раз используется обращение к объекту и имеет смысл вынести в переменную.

— когда лучше использовать cmsPage::getInstance()->method();
— если далее по коду обращение к объекту происходит один раз

на самом деле это просто личное предпочтение, но разумнее сделать как я описал выше, имхо.
#7 2 декабря 2012 в 22:12
Fuze, видимо предпочтения за последние годы поменялись))
Спасибо всем за ответы!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.