Часто приходится объяснять студентам "на пальцах", что такое "классы", "объекты" и что значит это "наследование" в ООП. И вот недавно, объясняя эти вещи студентам в очередной раз, написал небольшой "жизненный" пример призванный облегчить переход мозга юного специалиста к объектно-ориентированному мышлению.
Итак, что же такое классы и их наследники и чем они отличаются от объектов.
Возьмём, к примеру, класс
Стол. Этот класс обладает свойствами:
Длина,
Ширина,
Высота. И имеет метод, например:
Стоять.
У класса
Стол есть наследники (дочерние классы). Например, класс
ПисьменныйСтол и
КомпьютерныйСтол. Эти классы наследуют от родительского класса
Стол все его свойства (
Длина,
Ширина,
Высота) и методы (
Стоять), но класс
ПисьменныйСтол, по мимо унаследованных от родительского класса
Стол свойств и методов, может иметь дополнительное своство
КоличествоЯщиков и метод
ВыдвинутьЯщик. Также и класс
КомпьютерныйСтол может иметь свойство
КоличествоСекцийДляCD и метод
ВыдвинутьСтолешницу.
Стол,
КомпьютерныйСтол и
ПисьменныйСтол -- это классы.
Почему?
Потому что это некоторые сущности, которые описывают некий набор свойств и поведений характерных для всех столов (класс
Стол) или только для компьютерных столов (класс
КомпьютерныйСтол) или только для письменных столов (класс
ПисьменныйСтол).
Но тогда что же такое объект?
Объект -- это стол за которым ты сейчас сидишь (причём скорее всего это объект класса
КомпьютерныйСтол). Объект -- это (в большинстве случаев) экземпляр некоторого класса. Также как твой компьютерный стол является экземпляром класса
КомпьютерныйСтол.
Перенося всё это в PHP код получим:
<?php
/**
* Стол
*/
class Table {
/**
* Длина стола
* @var float
*/
public Length;
/**
* Ширина стола
* @var float
*/
public Width;
/**
* Высота стола
* @var float
*/
public Height;
/**
* Осуществляет стояние стола
*/
public function Stand() {
}
}
/**
* КомпьютерныйСтол
*/
class ComputerTable extends Table {
/**
* Количество секций для CD
* @var int
*/
public CDSectionsCount;
/**
* Выдвигает столешницу с клавиатурой
*/
public function MoveOutTabletop() {
}
}
/**
* ПисьменныйСтол
*/
class Desk extends Table {
/**
* Количество ящиков
* @var int
*/
public DeskDrawerCount
/**
* Выдвигает ящик с указанным номером
* @param int $DeskDrawerNumber Номер выдвигаемого ящика
*/
public function MoveOutDeskDrawer($DeskDrawerNumber) {
}
}
$MyTable = new Table(); // а вот $MyTable -- это уже объект класса Table
$MyTable->Width = 1;
$MyTable->Height = 0.7;
$MyTable->Length = 3;
$MyComputerTable = new ComputerTable(); // $MyComputerTable -- тоже объект
$MyComputerTable->Width = 0.8; // и так как класс ComputerTable является
$MyComputerTable->Height = 0.7; // наследником класса Table, то он имеет
$MyComputerTable->Length = 0.5; // все теже свойства что и объект $MyTable
$MyComputerTable->CDSectionsCount = 5; // плюс новое свойство CDSectionsCount
$MyComputerTable->Stand(); // Аналогично свойствам наследуются и методы
$MyComputerTable->MoveOutTabletop();
?>
P.S.: PHP -- не лучший выбор для начала освоениея ООП, но сейчас я пишу в основном на нём.