Три загадочные буквы - ООП. На чём держится мир

374
.
Dionis
Здравствуйте, уважаемые пользователи JohnCMS. Если вы хорошо учились в школе, то наверняка должны знать, что земля круглая, вращается вокруг солнца, вокруг своей оси… бла-бла-бла… НЕ ВЕРЬТЕ! На самом деле земля плоская и держится на трёх китах. Это ещё пещерные люди доказали за десятки тысяч лет до нашей эры. А нынешнее представление мира это происки масонов и часть их плана по захвату мира. Во как! ))
Вы всё ещё читаете и до сих пор не вызвали добрых дядей в белых халатах? Тогда идём дальше. Я уже говорил в прошлой статье о том что модель ООП это отражение модели окружающего мира. Так вот, оказывается и оно (ООП), тоже держится на трёх китах трёх основных принципах объектно-ориентированного программирования: инкапсуляции, наследовании и полиморфизме.
Инкапсуляция.
Цитата из Wikipedia:
Инкапсуляция — свойство языка программирования, позволяющее объединить и защитить данные и код в объекте и скрыть реализацию объекта от пользователя (прикладного программиста).

Здесь два главных слова: объединить и защитить. Давайте рассмотрим их в отдельности.
Что значит “объединить данные и код” ? Это значит собрать воедино некие переменные (свойства объекта) и функции (методы объекта), выполняемые над этими переменными, в единое целое – объект. То есть это, то что мы рассматривали в прошлой статье на примере Васи Пупкина.
“Защитить” – это значит ограничить возможность использования свойств либо методов вне класса. Пример:
class Chelovek {
	public  $rost;		 // незащищённое поле
	public  $ves;		 // незащищённое поле
	private $cvet_glaz;	 // защищённое поле, обращаться к нему можно только внутри класса
	
	function __construct ($r, $v, $c) {
		$this->rost = $r;
		$this->ves = $v;
		$this->cvet_glaz = $c; // обращаемся к защищённому полю внутри класса, всё ОК
	}	
	function Info () {
		echo $this->rost;
		echo $this->ves;
		echo $this->cvet_glaz;  // здесь тоже всё ОК
	}
}

$Vasya_Pupkin = new Chelovek(180, 85, 'зелёный');

$Vasya_Pupkin->rost = 150; 
$Vasya_Pupkin->ves = 60; 
$Vasya_Pupkin->cvet_glaz = 'синий';  // а этот код вызовет ошибку, так как мы обращаемся к защищённому полю ВНЕ класса

Вы конечно же заметили новые слова public и private в описании полей класса. Это модификаторы доступа. Как они работают, надеюсь, вы поняли из примера.
Для получения доступа к защищённым полям можно использовать “волшебные ” методы __get, и __set (о них речь пойдёт в следующих статьях) или добавить специальные методы в функционал класса, называемые геттером (от англ. get- “получить” ) и сеттером (от англ. set- “установить” ).
function setCvet_glaz ($val) {
	$this-> сvet_glaz = $val;
}
function getCvet_glaz () {
	return $this-> сvet_glaz;
}

Кстати, защищёнными могут быть не только поля, но и методы класса. Например:
class Chelovek {
	public  $rost;		 // незащищённое поле
	public  $ves;		 // незащищённое поле
	private $cvet_glaz;	 // защищённое поле, обращаться к нему можно только внутри класса
	
	public function __construct ($r, $v, $c) {
		$this->rost = $r;
		$this->ves = $v;
		$this->cvet_glaz = $c; 
	}	
	public function Info () {
		echo $this->rost;
		echo $this->ves;
		echo $this->cvet_glaz;
	}
	public function Rabota() {
		echo 'Я пошёл на работу!';
		$this->Zarplata();
		$this->Uvolnenie();
	}
	private function Zarplata() {  // защищённый метод, обращаться к нему можно только внутри класса
		$r = rand (0,3);
		if ($r == 1) echo 'Ура! Сегодня я получил зарплату';
		else echo 'Эх... Опять на ужин Доширак ((';
	}
	private function Uvolnenie() { // защищённый метод, обращаться к нему можно только внутри класса
		$r = rand (0,10);
		if ($r == 1) echo 'Плак-плак... Меня уволили';
	}
}	

$Vasya_Pupkin = new Chelovek(180, 85, 'зелёный');

$Vasya_Pupkin->Rabota();
$Vasya_Pupkin->Zarplata(); // Хватит валяться на диване! Иди работай, тогда и зарплата будет

В PHP (как и в других языках) существует три типа модификаторов:
Public – позволяет обращаться к члену класса (полю, методу) в любом месте программы. Public является алиасом (синонимом) var и ставиться по умолчанию.
Private – позволяет обращаться к членам класса только внутри методов этого класса.
Protected – к членам с этим модификатором можно обращаться внутри класса и классах унаследованных от данного (о наследовании см. далее).
Теперь давайте разберёмся зачем собственно нам нужен этот велосипед. Как видно из вышенаписанного примера Вася Пупкин не может получить зарплату, не сходив на работу. И это правильно! Следовательно, модификаторы доступа помогают предотвратить нежелательные действия с объектом, порой приводящим к весьма печальным последствиям. Это хороший способ защитить программу от кривизны собственных рук или, что ещё более важно, от кривизны рук других программистов, работающих с Вашим классом.
Последней темой в разделе инкапсуляции рассмотрим константы, статические поля и статические методы.
Константы – это поля КЛАССА, которые не могут быть изменены в процессе работы программы.
class Chelovek {
	public  $rost;		 
	public $ves;		 
	private $cvet_glaz;	
	const MAXROST = 240;   // константа

	function __construct ($r, $v, $c) {
		if ($r > self::MAXROST) {
			echo 'Под чем ты был, когда видел таких великанов?';
			$this->rost = self::MAXROST; }
		else 
			$this->rost = $r;
		$this->ves = $v;
		$this->cvet_glaz = $c;
	}
}
echo Chelovek::MAXROST;

Обратите внимание на синтаксис. Для обращения к константе внутри класса используется служебное слово self, которое определяет текущий класс, символ :: и имя константы. Для обращения вне класса необходимо написать имя класса, символ :: и имя константы.
Статические поля отличаются от констант лишь тем, что их можно изменять по ходу программы.
class Chelovek {
	public  $rost;
	public $ves;		 
	public static $MaxVes = 150;		
	private $cvet_glaz;	 
	const MAXROST = 240;
	
	function __construct ($r, $v, $c) {
		$this->rost = $r;
		if ($v > self::$MaxVes) {
			echo 'Сам ты жирный!';
			$this->ves = self::$MaxVes; }
		else
			$this->ves = $v;
		$this->cvet_glaz = $c; 
	}
}
echo Chelovek::$MaxVes;    // выведет 150
Chelovek::$MaxVes = 100;
$Vasya_Pupkin = new Chelovek(180, 150, 'зелёный');  // Нет, наш Вася держит себя в форме!

Собственно тоже самое и со статическими методами.
class Chelovek {
	public  $rost;
	public $ves;		 
	public static $MaxVes = 150;		
	private $cvet_glaz;	 
	const MAXROST = 240;

static function StatInfo () {
		echo self::$MaxVes;
		echo self::MAXROST;
	}
}
Chelovek::StatInfo();

Вот и всё. На самом деле это не так сложно, как кажется на первый взгляд. Стоит лишь вдумчиво прочитать, понять и конечно же испытать всё на практике.
Начиная писать эту статью, я хотел рассказать в ней о всех трёх принципах ООП, но вовремя вспомнил, как сам толком не разобравшись в одном, переходил к другому. В итоге в голове образовывалась каша, и приходилось перечитывать всё заново. Поэтому о двух оставшихся “китах” речь пойдёт в следующих статьях.
Ту би континуед… ))

Вместо эпилога.
“Б…ть, чё за х…ня? Классы, объекты, принципы какие-то. Ничего не понимаю! Кароче, ну его нах…й это ООП! И без него обойдусь”. Так я думал около года назад, когда умел программировать только на PHP и захотел на нём освоить ООП. Тогда мне казалось, что эти три магические буквы научат меня писать мегакрутые скрипты за мегакороткое время. Промучавшись несколько дней так ничего и не поняв, я забросил это гиблое дело.
Время шло, я увлёкся изучением и программированием на Delphi. Тут я столкнулся с ООП второй раз. Сначала был лёгкий шок. Как же я обходился без этого чуда?! То что раньше занимало 200-300 строк кода из-за многочисленного копипаста с небольшими переделками, теперь благодаря наследованию и полиморфизму помещалось в 50-100 строк. Код стал намного красивее и понятнее. А как легко стало продумывать логику программ! Одним словом – красота!
К тому времени я уже давно не кодил на PHP. Но вспомнив о безуспешных попытках освоить на нём ООП, решил закончить начатое. Конечно в PHP дело обстояло не так красочно как в Delphi, но всё же изучив синтаксис, почитав статьи об особенностях реализации объектно-ориентированного подхода в PHP и выудив крупицы полезной информации из сотен холиваров на различных форумах, я понял что и программируя на нём можно облегчить себе жизнь, если с умом подойти к использованию объектно-ориентированного метода.
К чему это всё? Да к тому что если вы действительно хотите овладеть всей магией ООП и в полной мере насладиться прелестями её использования, то лучше начать изучение с других “более ООП-шных” языков. Нервов затратите меньше, пользы будет больше. Для тех же, кто просто делает небольшие сайты для себя, можно вообще не забивать себе голову лишней информацией. Но я всё же советую вам хотя бы на базовом уровне овладеть этой технологией. Во-первых, вы сможете использовать в своих скриптах разработки других программистов (сейчас в интернете можно найти множество классов и библиотек для работы с графикой, мультимедиа, да и вообще с чем только возможно), это убережёт вас от создания собственного велосипеда и следовательно у вас останется больше времени на разработку своего проекта. Во-вторых, я уже говорил, что ООП-PHP всё же помогает облегчить себе жизнь и избавляет от множества рутинной работы (если подойти с умом, иначе всё будет с точностью да наоборот). В-третьих, кто знает, вдруг вы профессионально займётесь сайтостроительством и будете разрабатывать крупные проекты, в которых без ООП хоть и можно, но сложно обойтись. В любом случае решать Вам!
Exit;
.
В стельку трезвый
Ты на каждый раздел книги по ооп будешь создавать тему?
.
Максим, ага ))
.
В стельку трезвый
Ограничься лучше одной.
.
Максим, можно это вторым постом в пердыдущей моей теме прикрепить
.
В стельку трезвый
Нельзя.
.
Максим, тогда на каждую статью по отдельной теме. Почему не напишу всё стразу можно узнать прочитав до конца вышенаписанную статью
.
млиа а я нифига не понял, шо такое $this?
.
Указатель на объект вызвавший метод?
.
Ma7teR,
Обратите внимание на переменную $this. С её помощью мы обращаемся к свойствам и методам объекта внутри методов класса

это из предыдущей статьи. Прочитай её внимательно и всё поймёшь.
Всего: 10