PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Обзор: ООП где-то рядом ч.2. (Бывшая тема "ООП с самого начала")
DeepVarvar Супермодератор
Отправлено: 19 Ноября, 2011 - 23:37:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10378
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Обзор: ООП где-то рядом ч.2.
(Бывшая тема "ООП с самого начала" http://forum.php.su/topic.php?fo...33&topic=744 )

1. Снова функции

Мы еще раз вернемся к функциям чтобы на их примере глубже понять суть наших дальнейших действий с классами.
Представим себе что у нас есть функция set_A_plus_value() с локальной переменной $a внутри.
Нам нужно изменить значение этой переменной прибавив к текущему значению переданный аргумент.
PHP:
скопировать код в буфер обмена
  1. function set_A_plus_value($arg) {
  2.   $a = 0;
  3.   $a += $arg; // эквивалентно: $a = $a + $arg
  4.   }

Эта функция ничего не возвращает. Однако,
например нам нужно получить значение переменой $a содержащейся внутри функции.
PHP:
скопировать код в буфер обмена
  1. function show_A_value() {
  2.   $a = 20;
  3.   echo $a;
  4.   }

Ну а если мы хотим объединить эти функции для манипуляций с одной переменной, можно сделать например так:
PHP:
скопировать код в буфер обмена
  1. $a = 0;
  2.  
  3. function set_A_plus_value($arg) {
  4.   global $a;
  5.   $a += $arg;
  6.   }
  7.  
  8. function show_A_value() {
  9.   global $a;
  10.   echo $a;
  11.   }

Мы установили для $a значение 0 (ноль) и в обеих функциях объявили $a как глобальную.
Теперь можно работать так как нам нужно.
Однако это не очень удобно.

2. Методы в классах

Положим у нас есть класс с одним свойством $a и двумя методами, вот такой:
PHP:
скопировать код в буфер обмена
  1. class myClass {
  2.  
  3.   var $a = 0;
  4.  
  5.   function setPlus($arg) {
  6.     $this->a += $arg;
  7.     }
  8.  
  9.   function showValue() {
  10.     echo $this->a;
  11.     }
  12.  
  13.   }
  14.  
  15. // посмотрим как это работает
  16. $my = myClass;
  17. $my->setPlus(10);
  18. $my->setPlus(2);
  19. $my->showValue(); // выведет 12

Если на вскидку, это как минимум понятнее, меньше кода и гораздо аккуратнее.
Свойство $a не нужно объявлять глобальным для методов внутри этого класса.

Как правило методы либо изменяют значения свойств, либо возвращают (или выводят на экран) значения этих свойств.
Однако, спросите вы, а почему бы не обратиться к свойству напрямую для вывода результата:
PHP:
скопировать код в буфер обмена
  1. $my = myClass;
  2. $my->setPlus(10);
  3. $my->setPlus(2);
  4. echo $my->a; // выведет 12

Нахрена тогда нужен этот второй метод? Хм... Наберитесь чуток терпения, скоро станет ясно.

3. Свойства в классах

Наверное у каждого из вас есть свои "скелеты в шкафу". Свои секреты, которые вы никогда не хотели бы рассказывать.
А есть вещи, которыми вы хотите хвастать перед любым встречным.

Если рассматривать вас как объект, то это ваши свойства. Одни приватные, другие - публичные.
Тогда модифицируем наш класс:
PHP:
скопировать код в буфер обмена
  1. class myClass {
  2.  
  3.   private $a = 0;
  4.  
  5.   function setPlus($arg) {
  6.     $this->a += $arg;
  7.     }
  8.  
  9.   function showValue() {
  10.     echo $this->a;
  11.     }
  12.  
  13.   }

Теперь если обратиться к приватному свойству извне, это вызовет ошибку:
PHP:
скопировать код в буфер обмена
  1. echo $my->a; // будет ошибка

Это мы сделали для того, чтобы кто либо не смог просто так изменить, да еще и не правильно изменить наше заветное свойство.
По умолчанию var объявляет свойство публичным, кроме того в скором времени такое объявление исключат из пхп.
Поэтому лучше всего сразу явно указывать какое это свойство: private или public.

4. Еще о методах

Ну конечно же! Методы тоже могут быть приватными и публичными!
Модифицируем наш класс еще:
PHP:
скопировать код в буфер обмена
  1. class myClass {
  2.  
  3.   private $a = 0;
  4.  
  5.   public function setPlus($arg) {
  6.     $this->a += $arg;
  7.     }
  8.  
  9.   public function showValue() {
  10.     echo $this->a;
  11.     }
  12.  
  13.   }

Самое важное это то, что при обращении к публичному методу мы спокойно можем получить значение приватного свойства,
и никакой ошибки это не вызовет. Действительно, метод то публичный, а манипулирует с свойством он уже внутри класса.
Для чего же это сделано?

В первой статейке я говорил что методы внутри класса выполняют некий один вид действий, например работу с БД.
Это не совсем так. Иногда необходимо сделать какие либо дополнительные действия по обработке или проверке данных. Метод может вызывать во время своего выполнения еще какие-то методы. Те в свою очередь тоже.
Но! Совсем не нужно чтобы внешние объекты или функции знали о том как и что происходит внутри нашего объекта.

Спойлер (Отобразить)


Для них открыты только те методы, которые мы пожелаем.
Разберем это на примере:
PHP:
скопировать код в буфер обмена
  1. class myClass {
  2.  
  3.   /**
  4.   * это наше свойство с которым мы будем разбираться
  5.   **/
  6.   private $a = 0;
  7.  
  8.   /**
  9.   * это приватный метод
  10.   * он проверяет целое ли число пришло
  11.   * и в зависимости от результата
  12.   * возвращает true или false
  13.   **/
  14.   private function checkArg($arg) {
  15.     return (is_int($arg)) ? true : false;
  16.     }
  17.  
  18.   /**
  19.   * метод, перед тем как прибавлять
  20.   * просит проверить валидность данных
  21.   * у приватного метода checkArg()
  22.   * и только если все хорошо, прибавляет это значение
  23.   **/
  24.   public function setPlus($arg) {
  25.     if ($this->checkArg($arg)) $this->a += $arg;
  26.     }
  27.  
  28.   /**
  29.   * ну а этот как обычно, выводит текущее значение
  30.   **/
  31.   public function showValue() {
  32.     echo $this->a;
  33.     }
  34.  
  35.   }

На деле, чем меньше публичных методов и свойств имеет некоторый сложный объект - тем лучше.
Но это не значит что приватных свойств и методов должно становится больше.
Наверное я даже скажу слово: API - это есть методы и свойства которые открыты для других.

----

Ну и хватит на пока..
И так уже слишком много...
(Добавление)
Как можно заметить тут мы разбираем примеры с одним единственным классом.
В дальнейшем же будем разбирать примеры взаимодействия классов и объектов между собой.

(Отредактировано автором: 20 Ноября, 2011 - 00:18:21)

 
 Top
Panoptik
Отправлено: 20 Ноября, 2011 - 00:17:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2496
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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


-----
Just do it
 
 Top
DlTA
Отправлено: 20 Ноября, 2011 - 02:03:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2914
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DeepVarvar, читали статью на хабре,
вот если б с подобным пояснением + подобный вашему код, наверное было б оптимально.
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Ноября, 2011 - 03:29:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10378
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Хы Закатив глазки
 
 Top
Bio man
Отправлено: 22 Ноября, 2011 - 17:22:10
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2752
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




зачет, жду продолжение! +
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Обсуждение статей »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB