Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008
Откуда: Альфа Центавра
Помог: 353 раз(а)
|
Обзор: ООП где-то рядом ч.2.
(Бывшая тема "ООП с самого начала" http://forum.php.su/topic.php?fo...33&topic=744 )
1. Снова функции
Мы еще раз вернемся к функциям чтобы на их примере глубже понять суть наших дальнейших действий с классами.
Представим себе что у нас есть функция set_A_plus_value() с локальной переменной $a внутри.
Нам нужно изменить значение этой переменной прибавив к текущему значению переданный аргумент.
Эта функция ничего не возвращает. Однако,
например нам нужно получить значение переменой $a содержащейся внутри функции.
Ну а если мы хотим объединить эти функции для манипуляций с одной переменной, можно сделать например так:
PHP:
скопировать код в буфер обмена
$a = 0; function set_A_plus_value($arg) { global $a; $a += $arg; } function show_A_value() { global $a; echo $a; }
Мы установили для $a значение 0 (ноль) и в обеих функциях объявили $a как глобальную.
Теперь можно работать так как нам нужно.
Однако это не очень удобно.
2. Методы в классах
Положим у нас есть класс с одним свойством $a и двумя методами, вот такой:
PHP:
скопировать код в буфер обмена
class myClass { var $a = 0; function setPlus($arg) { $this->a += $arg; } function showValue() { echo $this->a; } } // посмотрим как это работает $my = myClass; $my->setPlus(10); $my->setPlus(2); $my->showValue(); // выведет 12
Если на вскидку, это как минимум понятнее, меньше кода и гораздо аккуратнее.
Свойство $a не нужно объявлять глобальным для методов внутри этого класса.
Как правило методы либо изменяют значения свойств, либо возвращают (или выводят на экран) значения этих свойств.
Однако, спросите вы, а почему бы не обратиться к свойству напрямую для вывода результата:
Нахрена тогда нужен этот второй метод? Хм... Наберитесь чуток терпения, скоро станет ясно.
3. Свойства в классах
Наверное у каждого из вас есть свои "скелеты в шкафу". Свои секреты, которые вы никогда не хотели бы рассказывать.
А есть вещи, которыми вы хотите хвастать перед любым встречным.
Если рассматривать вас как объект, то это ваши свойства. Одни приватные, другие - публичные.
Тогда модифицируем наш класс:
PHP:
скопировать код в буфер обмена
class myClass { private $a = 0; function setPlus($arg) { $this->a += $arg; } function showValue() { echo $this->a; } }
Теперь если обратиться к приватному свойству извне, это вызовет ошибку:
Это мы сделали для того, чтобы кто либо не смог просто так изменить, да еще и не правильно изменить наше заветное свойство.
По умолчанию var объявляет свойство публичным, кроме того в скором времени такое объявление исключат из пхп.
Поэтому лучше всего сразу явно указывать какое это свойство: private или public.
4. Еще о методах
Ну конечно же! Методы тоже могут быть приватными и публичными!
Модифицируем наш класс еще:
PHP:
скопировать код в буфер обмена
class myClass { private $a = 0; public function setPlus($arg) { $this->a += $arg; } public function showValue() { echo $this->a; } }
Самое важное это то, что при обращении к публичному методу мы спокойно можем получить значение приватного свойства,
и никакой ошибки это не вызовет. Действительно, метод то публичный, а манипулирует с свойством он уже внутри класса.
Для чего же это сделано?
В первой статейке я говорил что методы внутри класса выполняют некий один вид действий, например работу с БД.
Это не совсем так. Иногда необходимо сделать какие либо дополнительные действия по обработке или проверке данных. Метод может вызывать во время своего выполнения еще какие-то методы. Те в свою очередь тоже.
Но! Совсем не нужно чтобы внешние объекты или функции знали о том как и что происходит внутри нашего объекта.
Спойлер (Отобразить)Птица тоже знает что для того чтобы полететь надо помахать крыльями.
Она же не думает что ее мышцам нужна АТФ-кислота которую клетки получают с помощью катализатора кислорода, который вдыхают легкие,
который доставляет кровь по венам, которую гонит сердце, которое бъется,
которое заставляют нервные окончания спинного мозга.... и т.д...
Для них открыты только те методы, которые мы пожелаем.
Разберем это на примере:
PHP:
скопировать код в буфер обмена
class myClass { /** * это наше свойство с которым мы будем разбираться **/ private $a = 0; /** * это приватный метод * он проверяет целое ли число пришло * и в зависимости от результата * возвращает true или false **/ private function checkArg($arg) { return (is_int($arg)) ? true : false; } /** * метод, перед тем как прибавлять * просит проверить валидность данных * у приватного метода checkArg() * и только если все хорошо, прибавляет это значение **/ public function setPlus($arg) { if ($this->checkArg($arg)) $this->a += $arg; } /** * ну а этот как обычно, выводит текущее значение **/ public function showValue() { echo $this->a; } }
На деле, чем меньше публичных методов и свойств имеет некоторый сложный объект - тем лучше.
Но это не значит что приватных свойств и методов должно становится больше.
Наверное я даже скажу слово: API - это есть методы и свойства которые открыты для других.
----
Ну и хватит на пока..
И так уже слишком много...
(Добавление)
Как можно заметить тут мы разбираем примеры с одним единственным классом.
В дальнейшем же будем разбирать примеры взаимодействия классов и объектов между собой.(Отредактировано автором: 20 Ноября, 2011 - 00:18:21)
|