PHP ОПП. Класс, объект, интерфейс, абстракция, инкапсуляция, наследование, полиморфизм.

fgh's picture

1 Cвойства

 <?php
	class User
	{
		public $name;
		public $age;
	}
	
	$user = new User; // создаем объект нашего класса
	$user->name = 'Коля'; // записываем имя в свойство name
	$user->age = 25; // записываем возраст в свойство age
	
	echo $user->name; // выводим записанное имя
	echo $user->age; // выводим записанный возраст
?> 

2 Методы

<?php
	class User
	{
		public $name;
		public $age;
		
		// Создаем метод:
		public function show()
		{
			return '!!!';
		}
	}

	$user = new User;
	$user->name = 'Коля';
	$user->age = 25;
	// Вызовем наш метод:
	echo $user->show(); // выведет '!!!'
?>

3 $this

Для того, чтобы обратиться к свойству класса
внутри метода этого класса, вместо имени объекта следует
писать специальную переменную $this.


<?php
	class User
	{
		public $name;
		public $age;
		
		public function show()
		{
			// Возвращаем имя:
			return $this->name;
		}
	}
	$user = new User; // создаем объект класса
	$user->name = 'Коля'; // записываем имя
	$user->age = 25; // записываем возраст
	// Вызываем наш метод:
	echo $user->show(); // выведет 'Коля'
?>

4 Модификаторы доступа public private

Ключевое слово public указывает на то, что данные свойства
и методы доступны извне (вне кода класса). В противоположность public есть
ключевое слово private, которое указывает на то, что свойства
и методы недоступны извне.

<?php
	class User
	{
		private $name;
		private $age;
	}
	$user = new User;
	// Выдаст ошибку, так как свойство name - private:
	$user->name = 'Коля';
?>

5 Конструкторы.

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

<?php
	class User
	{
		public $name;
		public $age;	
		// Конструктор объекта:
		public function __construct($name, $age)
		{
                      // запишем данные в свойство name
			$this->name = $name; 
                      // запишем данные в свойство age
			$this->age = $age; 
		}
	}
       // создадим объект, сразу заполнив его данными
	$user = new User('Коля', 25); 
	echo $user->name; // выведет 'Коля'
	echo $user->age; // выведет 25
?>

6 Геттеры и Сеттеры

<?php
	class User
	{
		public $name;
		private $age; // объявим возраст приватным	
		// Метод для чтения возраста юзера:
		public function getAge()
		{
			return $this->age;
		}	
		// Метод для изменения возраста юзера:
		public function setAge($age)
		{
			// Проверим возраст на корректность:
			if ($this->isAgeCorrect($age)) {
				$this->age = $age;
			}
		}	
		// Метод для проверки возраста:
		private function isAgeCorrect($age)
		{
			return $age >= 18 and $age <= 60;
		}
	}
	$user = new User;
	// Установим возраст:
	$user->setAge(50);
	// Прочитаем новый возраст:
	echo $user->getAge(); // выведет 50
?>

7 Наследование классов

<?php
	class User
	{
		private $name;
		private $age;
		
		public function getName()
		{
			return $this->name;
		}
		
		public function setName($name)
		{
			$this->name = $name;
		}
		
		public function getAge()
		{
			return $this->age;
		}
		
		public function setAge($age)
		{
			$this->age = $age;
		}
	}
	class Employee extends User
	{
		private $salary;
		
		public function getSalary()
		{
			return $this->salary;
		}
		
		public function setSalary($salary)
		{
			$this->salary = $salary;
		}
		
	}
?>

8 Статические методы и Статические свойства

<?php
	class Test
	{
		// Статический метод:
		public static function method()
		{
			return '!!!';
		}
	}
// Чтобы обратиться к статистическому методу, не надо создавать объект
echo Test::method(); // выведет '!!!'
?>
Статистические свойства
<?php
	class Test
	{
		// Статическое свойство:
		public static $property;
	}

	Test::$property = 'test';
	echo Test::$property; // выведет 'test'
?>

9 Переопределене метода

10 Классы и объекты.

Класс , это чертеж, по которому сделали автомобиль
Автомобиль, сделанный по чертежу - это объект класса.

Структура синтаксиса:

<?php
	class Car
	{
		// тут код, то есть PHP-чертеж автомобиля
	}
?>

11 Абстрактные классы и интерфейсы

Абстрактные классы представляют собой классы, предназначенные для наследования от них. При этом объекты таких классов нельзя создать.
Объявление абстрактного класса:

<?php
	abstract class User
	{	
	}
?>
Абстрактные классы также могут содержать абстрактные методы.

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

Реализация абстрактного метода:

<?php
	abstract class User
	{
		private $name;
		
		public function getName()
		{
			return $this->name;
		}
		
		public function setName($name)
		{
			$this->name = $name;
		}
		
		// Абстрактный метод без тела:
		abstract public function increaseRevenue($value);
	}
?>
<?php
	abstract class User
	{
		private $name;
		
		public function getName()
		{
			return $this->name;
		}
		
		public function setName($name)
		{
			$this->name = $name;
		}
		
		abstract public function increaseRevenue($value);
	}
	
	class Employee extends User
	{
		private $salary;
		
		public function getSalary()
		{
			return $this->salary;
		}
		
		public function setSalary($salary)
		{
			$this->salary = $salary;
		}
	}
?>

<?php
	class Employee extends User
	{
		private $salary;
		
		public function getSalary()
		{
			return $this->salary;
		}
		
		public function setSalary($salary)
		{
			$this->salary = $salary;
		}
		
		// Напишем реализацию метода:
		public function increaseRevenue($value)
		{
			$this->salary = $this->salary + $value;
		}
	}

	$employee = new Employee;
	$employee->setName('Коля'); // установим имя
	$employee->setSalary(1000); // установим зарплату
	$employee->increaseRevenue(100); // увеличим зарплату
	
	echo $employee->getSalary(); // выведет 1100
?>

13

Интерфейсы представляют собой классы, у которых все методы являются публичными и не имеющими реализации.

Пример итнерфейса:

<?php
	interface Figure
	{
		public function getSquare();
		public function getPerimeter();
	}
?>

Интерфейс реализуется через служебное слово implements :

class Quadrate implements Figure
	{
		private $a;	
		public function __construct($a)
		{
			$this->a = $a;
		}
		public function getSquare()
		{
			return $this->a * $this->a;
		}	
		public function getPerimeter()
		{
			return 4 * $this->a;
		}
	}

14 Абстракция, инкапсуляция, наследование, полиморфизм

15 Магические методы http://code.mu/ru/php/book/oop/magic/__t...

16 Полиморфизм
Полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового

17 Трейты http://code.mu/ru/php/book/oop/traits/
Ранее мы уже проходили решение этой проблемы: вместо наследования использовать объекты одних классов внутри других.В PHP есть и другой способ. Он заключается в использовании трейтов.
Трейты подключаются через инструкцию use. и все его методы становятся доступными.

Источники:
1) http://code.mu/ru/php/book/oop/
https://habr.com/ru/post/37576/