Обучение в PHP - част 7 (Работа с класове)
Работа с класове

Запознаване с класовете

В терминологията на обектно ориентираното програмиране, класът се дефинира като множество от обекти, които имат общи характеристики и поведение. Заедно с това обектът се дефинира като представител на даден клас, който се идентифицира уникално и предоставя функционалност, която е обща за целия клас.

За да разберете и да свържете с реалния живот концепцията за класове и обекти, ще разгледаме един прост пример. Паунът, врабчето и враната са птици. Защо? Защото имат общи характеристики. Всяка от тях снася яйца и излюпва малките си, всяка от тях е покрита с пера и може да лети. Затова можете да кажете, че паунът, врабчето и враната са уникални обекти, които имат сходство в структората и поведението и принадлежат към класа, наречен птици.

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

В следващите секции ще видите как можете да създадете класове и обекти от тези класове в PHP.

Създаване на клас

В PHP можете да дефинирате ( или създадете ) клас, като използвате следния синтаксис:

class име_на клас // Деклариране на класа
{
// Деклариране на поле ( променлива на класа )
var $име_на_променлива;
// Деклариране на метода ( функция на класа )
function име_на_функция ( $аргумент 1, [...] [...], $аргумент n)
{
// Код на функцията
} // Тук свършва декларацията на метода
} // Тук свършва декларацията на класа


Можете да създадете следния прост клас, като използвате горния синтаксис:

<?php

class PrintName
{
var $name;

function show_name()
{
echo "Hi $name";
}
}

?>


В горният пример се създава клас с име PrintName. Класът съдържа едно поле с име name. Класът също така съдържа метод show_name. При извикването на този метод ( за това ще видите по-късно ) на екрана се появяват две съобщения, съдържащи стойността на полето name.
Обърнете внимание на ключовата дума var преди полето name. Полетата на класовете винаги се декларират с ключовата дума var. Това е така, защото var декларира променливите като част от даден клас и така позволява на полетата да бъдат достъпни извън класа. Ако забравите да сложете ключовата дума var, ще получите съобщение за грешка.

След като видяхте, как можете да създадете клас в PHP, сега ще видите как можете да го използвате. Както в другите езици за обектно-ориентирано програмиране, данните, намиращи се в клас ( полетата характеристики ), и методите не са достъпни извън класа! Ако си спомняте основните концепции на обектно ориентираното програмиране, тази особеност е позната на програмисите, като капсуловане. Капсуловането означава защитаване на неважните данни от външен клас за достъп.

Полетата и методите са скрити в класа и са недостъпни. Но как можете да ги използвате извън класа? За да направите това трябва да инсталирате класа. В следващата секция ще разгледате инстанциране на класовете.

Инстанциране на класове - Създаване на обекти

Класът е просто декларация. Поради тази причина, той не съществува, докато не зададете поне една негова инстанция. В терминологията на обектно-ориентираното програмиране, тази инстанция н акласа се нарича обект. След като създадете обект от даден клас, можете да осъществите достъп до полетата и методите, скрити в класа, към който пренадлежи обектаът. Да разгледаме следния пример, за да видите как можете да използвате променливата name и метода show_name() на класа PrintName

<?php

class PrintName
{
var $name;

function show_name()
{
echo ;
echo "Hi $name";
}
}
$obj1 = new PrintName //Инстанциране на класа с име "PrintName"
// с обект с име "obj1"

$obj1 -> name = "George"; // Задаване на стойността "George" на полето "name"
$obj1 -> show_name(); // Извикване на метода "show_name()"

?>


В горния пример се създава обект с име obj1 от класа PrintName. Този обект инстанцира класа PrintName. Това означава, че за класа има заделена памет и имате достъп до методите му, чрез обекта obj1. Обектът obj1 използва оператора -> за осъществяване на достъп до полето name и до метода show_name(). На полето name в обекта obj1 се задава стойността Gerge чрез реда $obj1 -> name = "George"; и след това се извиква методът show_name(), който показва съобщението "Hi George!". Видяхте как можете да осъществите достъп до членове на класа с помпща на обекти. Сега ще видите как можете да осъществите достъп до методите, без изопщо да използвате обект!

Извикване на методи от клас без инстанциране

Можете да извикате методи на клас, без да ви се налага преди това инстанцирате класа. За целта трябва да използвате нотацията ::. Разгледайте следния пример за да видите как става това.

<?php

class area
{
function calculate_area( $lenght, $breadth)
{
return $lenght * $breadth;
}
}

$result = area :: calculate_area(225, 56);
echo "The area Is : $result. ";


В горния пример с използването на нотацията :: се осъществява достъп до метода calculate_area() на класа area. Резултатът се изчислява на базата на стойностите, предоставени по време на извикването на метода, а резултатът се съхранява в променливата result. Резултатът от горния пример е The area Is 12600.

Променливата $this

Езикът PHP използва специална променлива $this за осъществяванена достъп до даден клас. Използването на променливата $this в PHP е аналогично на създаването на инстанция на класа в самия клас. Следващия пример е модификация на предишния пример с цел демонстриране на използването на променливата $this.

<?php

class PrintName
{
var $name = "George";

function show_name()
{
echo "Hi $this -> name.
}
}
$obj1 = new PrintName;
$obj1 -> show_name();

?>


В горния пример променливата name се използва директно в метода PrintName с помоща на променливта $this. Резултатът от горния код ще бъде : Hi george.

Също така можете да промените стойността на поле в метод, което е демонстрирано от следващия пример.

<?php

class PrintName
{
var $name = "George";

function show_name()
{
echo "Hi $this -> name.
}
function change_name($somename)
{
$this -> name = $somenaame; // Промяна на стойността
на полето name от "George" на новото име предадено на метода.
}
}
$obj1 = new PrintName;
$obj1 -> show_name();
$obj1 -> change_name ("Pesho");
$obj1 -> show_name();

?>


В гоерния пример първо на екрана се появява Hi George. , защото се извиква методът show_name() на обекта obj1, а стойността George е стойност по подразбиране за полето name. С реда $obj1 -> change_name ("Pesho"); се извиква методът change_name(), който задава стойността Pesho на полето name. След това се извиква методът show_name(), който на свой ред показва "Hi Pesho".

Както можеби сте забелязали, методите на класове, като нормални функции, не се извикват, преди да направите това явно. Това означава, че докато не напишете реда $obg1 -> show_name(), методът show_name(), няма да бъде извикан. В следващата секция, ще научите повече за методите, които се изпълняват автоматично при инстанциране на класа ( т.е. когато се създава обект от класа ).

Конструктори

Конструкторът е специален метод на класа, който се изпълнява автоматично, когато се създава обект от класа. Конструкторът, по дефиниция, трябва да има име, еднакво с името на класа. Това означава, че може да имате само един конструктор в даден клас. Следващият пример демонстрира използването на конструктор.

<?php

class PrintName
{
var $name;

function PrintName()
{
$this -> name = "Angelica";
echo "Hi $this -> name.
}
function show_name($somename)
{
echo "Hi $this ->name !";
}
}
$obj1 = new PrintName;
$obj2 = new PrintName;

?>


Резултатът от горната програма, ще бъде двъкратно показване на низа "Hi Angelica !". Това е така, защото методът PrintName се изпълнява при всяко създаване на обект от класа PrintName.

Разширяване на клас - наследяване на класове

Най-добрата черта на създаването и използването на класове е възможността да ги използвате повторно. Можете да създадете класа веднъж и след това да го използвате и в другите си програми. Това ви помага да си спестите много време. Езикът PHP, както и много други езици за обектно-ориентирано програмиране, разширява преизползваемостта на класовете, чрез реализация на механизма на наследяване. Наследяването ви позволява да създавате нови класове на базата на вече съществуващи. Тази стратегия ви позволява да използвате повторно необходимите методи и променливи в дъщерния клас и същевремено да добавите само допълнителната функционалност, като по този начин пишете по-малко код. Класът, чиито код се използва повторно се нарича родителски клас.

Трябва да използвате ключовата дума extends, за да декларирате, че класът наследява съществуващ клас. Синтаксисът е следния:

име_на_класа extends име_на_родителския_клас

Наследяването се прави от родителския към дъщерния клас. То се изразява в това, че даден обект от дъщерния клас има достъп до полетата и методите на радителския клас, но обектите от родителския клас нямат достъп до дъщерния. С други думи, обектът от родителския клас не може да използва методите и полетата на дъщерния клас. Следващият прост пример е за наследяване в PHP.

<?php

classParentClass
{
function show_message()
{
echo "Hi! This comes from the parent class.";
}
}
class ChildClass extends ParentClass // Наследяваме класа ChildClass от класа Parent
{
function show()
{
echo "Hi This comes from the child class."
}
}
$obj1 = new ParentClass; // Обект от ParentClass.
$obj1 -> show_message (); // Правилно - тъй като obj1 е обект от
// ParentClass и извиква метод от същия клас
$obj2 = new ChildClass; // Обект от ChildClass
$obj2 = show(); // Правилно - тъй като обект от класа
// ChildClass има достъп до методите на родителския клас.
$obj2 -> show_message(); // Правилно - тъй като обект от класа
// ChildClass има достъп до методите на родителския клас.
$obj1 -> show(); // Грешно, защото обект от класа ParentClass
// няма достъп до методите на дъщерния клас ChildClass

?>


В горния пример са декларирани два класа - ParentClass и ChildClass. Както се подразбира от името му, класът ChildClass наследява класа ParentClass с помоща на ключовата дума extends. Обектът obj1 е обект от класа ParentClass, а obj2 е от клас ChildClass. Когато обект obj2 извиква метода show_message() на класа ParentClass, на екрана се появява съобщението Hi ! This comes from the parent class. Това е възможно, защото класът ChildClass е наследник на класа ParentClass и има достъп до полетата и методите му. От друга страна, когато обектът obj1 извика метода show() на дъщерния клас ChildClass, PHP извежда съобщение за грешка. Това е така, защото методите и полетата на наследения клас са недостъпни за родителския клас ParentClass.

/ Трябва да сте регистриран за да напишете коментар /
От: b12gold
17:39 30-11-2009
един верен пример нямаш!!!! Нищо не работи, ако и ние се учим така ... много нещо ще научим
От: ventsi_konov
16:54 16-01-2011
Че какво не му харесваш? Примерите са идеални - не ги копирай, напиши си ги като гледаш тези и ще стане - случва се да липсва кавичка или скоба, какво толкова? Браво за урока, на мен ми беше полезен!
1