PHP: Êëàññû
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Êëàññ - ýòî îäíî èç êëþ÷åâûõ ïîíÿòèé òàê íàçûâàåìîãî "îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ". Òåìà ÎÎÏ äîñòàòî÷íî ñëîæíà äëÿ ïîíèìàíèÿ, íî å¸ îñâîåíèå äàñò âàì â ðóêè ìîùíåéøèé èíñòðóìåíò äëÿ ñîçäàíèÿ è ñîâåðøåíòâîâàíèÿ ñâîèõ ñêðèïòîâ. Ìû íå áóäåì âäàâàòüñÿ â äåáðè òåîðèè, à ðàññìîòðèì òîëüêî ñàìîå íåîáõîäèìîå.
Êëàññ ìîæíî ïðåäñòàâèòü êàê ôîðìàëüíîå îïèñàíèå íåêîåãî îáúåêòà, ó êîòîðîãî åñòü ñâîéñòâà è ìåòîäû. Ñâîéñòâî - ýòî êàêîå-òî çíà÷åíèå, àññîöèèðîâàííîå ñ êëàññîì, à ìåòîä - ôóíêöèÿ, ïðèíàäëåæàùàÿ êëàññó. Ïðîñòîé ïðèìåð êëàññà - "÷åëîâåê". Ñâîéñòâàìè ýòîãî êëàññà áóäåò "öâåò âîëîñ", "ðîñò", "âåñ" è ò.ä., à ìåòîäàìè - "ñïàòü", "åñòü", "õîäèòü" è ò.ï.
Äëÿ òîãî, ÷òîáû âîñïîëüçîâàòüñÿ êëàññîì, íåîáõîäèìî ñîçäàòü åãî ýêçåìïëÿð. Ýêçåìïëÿð êëàññà - ýòî ðåàëüíûé îáúåêò, äëÿ êîòîðîãî âûäåëåíà ïàìÿòü è óñòàíîâëåíû çíà÷åíèÿ âñåõ ñâîéñòâ. Äëÿ êëàññà "÷åëîâåê" ýêçåìïëÿðîì áóäåò êîíêðåòíûé èíäèâèä ñî ñâîèì öâåòîì âîëîñ, ðîñòîì, âåñîì è íîìåðîì ïàñïîðòà.
Îäíî èç ïðåèìóùåñòâ îáúåêòíîãî ïîäõîäà ïðè ðàçðàáîòêå ñèñòåì - âîçìîæíîñòü ñêðûòèÿ îñîáåííîñòåé ðåàëèçàöèè îòäåëüíûõ ìåòîäîâ. Íàïðèìåð, êëàññ "÷åëîâåê" ðåàëèçóåò ìåòîä "õîäèòü", êîòîðûé âûïîëíÿåò ïåðåìåùåíèå ýêçåìïëÿðà êóäà-ëèáî. Ïðè ýòîì íàì ñîâåðøåííî íå âàæíî, êàê áóäåò ïðîèçâåäåíî ïåðåìåùåíèå: íà íîãàõ, íà êîñòûëÿõ èëè ñòîÿ íà ðóêàõ. Ãëàâíîå - ìû çíàåì, ÷òî ïîñëå âûçîâà ìåòîäà "õîäèòü" ýêçåìïëÿð ïåðåìåñòèòñÿ êóäà ñêàæåì.
Ðàññìîòðèì äðóãîé ïðèìåð - ãðàôè÷åñêèå ôèãóðû. Íàïðèìåð:
<?php // îáúÿâëÿåì êëàññ ñ èìåíåì Rectangle class Rectangle { // ñâîéñòâî "øèðèíà" private $width; // ñâîéñòâî "âûñîòà" private $height; // êîíñòðóêòîð êëàññà public function __construct($x, $y) { $this->width = $x; $this->height = $y; } // ìåòîä "ïîñ÷èòàòü ïëîùàäü" public function Square() { return $this->width * $this->height; } } // ñîçäà¸ì ìàññèâ ïðÿìîóãîëüíèêîâ $rects = array(); // çàïîëíÿåì ìàññèâ ýêçåìïëÿðàìè $rects['1'] = new Rectangle(100, 100); $rects['2'] = new Rectangle(20, 200); $rects['3'] = new Rectangle(300, 50); // âûâîäèì ïëîùàäü êàæäîãî ýêçåìïëÿðà foreach($rects as $key => $rect) { echo 'Ïëîùàäü ' . $key . ' ïðÿìîóãîëüíèêà: ' . $rect->Square() . ">br />\n"; } ?>
Îáúÿâëåíèå êëàññà íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà "class", ïîñëå êîòîðîãî çàïèñûâàåòñÿ èìÿ êëàññà. Òåëî êëàññà (âñå ñâîéñòâà è ìåòîäû) îãðàíè÷èâàþòñÿ ôèãóðíûìè ñêîáêàìè "{}". Îáúÿâëåíèå ëþáîãî ñâîéñòâà èëè ìåòîäà íà÷èíàåòñÿ ñ êëþ÷åâûõ ñëîâ public èëè private, îïðåäåëÿþùèõ îáëàñòü âèäèìîñòè ñâîéñòâà èëè ìåòîäà. Ýëåìåíòû, ïîìå÷åííûå "public" (ïóáëè÷íûå) âèäíû èçâíå êëàññà, à ïîìå÷åííûå "private" (÷àñòíûå) ìîæíî èñïîëüçîâàòü òîëüêî âíóòðè ýòîãî æå êëàññà. Íàïðèìåð:
<?php // ñîçäà¸ì ýêçåìïëÿð êëàññà $rect = new Rectangle(100, 100); // âûçîâ ïóáëè÷íîãî ìåòîäà echo $rect->Square(); // ïîïûòêà îáðàæåíèÿ ê çàêðûòîìó // ñâîéñòâó âûçîâåò îøèáêó echo $rect->width; ?>
Ñâîéñòâà êëàññà îáúÿâëÿþòñÿ êàê îáû÷íûå ïåðåìåííûå (ñì. ïåðåìåííûå $width è $height), à ìåòîäû êëàññà - êàê îáû÷íûå ôóíêöèè. Îñíîâíîå îòëè÷èå â òîì, ÷òî âíóòðè ìåòîäà íåïîñðåäñòâåííî äîñòóïíû âñå ñâîéñòâà è ìåòîäû äàííîãî êëàññà, ò.å. íåò íåîáõîäèìîñòè ïîëüçîâàòüñÿ êîíñòðóêöèåé global. Äëÿ óêàçàíèÿ òîãî, ÷òî âû õîòèòå îáðàòèòüñÿ ê ìåòîäó èëè ñâîéñòâó òåêóùåãî ýêçåìïëÿðà íàäî âîñïîëüçîâàòüñÿ ññûëêîé $this, êîòîðàÿ àâòîìàòè÷åñêè äîñòóïíà âíóòðè ýêçåìïëÿðà ëþáîãî êëàññà (ñì. êîä ìåòîäà Square() ).
Ýêçåìïëÿð êëàññà ñîçäà¸òñÿ ïðè ïîìîùè êëþ÷åâîãî ñëîâà "new" è èìåíè êëàññà. Êîíñòðóêöèþ
<?php $rect = new Rectangle(100, 100); ?>
ñëåäóåò ÷èòàòü êàê "Ñîçäàòü ýêçåìïëÿð êëàññà Rectangle ñ âûñîòîé 100, øèðèíîé 100, ññûëêó íà ýêçåìïëÿð ïîìåñòèòü â ïåðåìåííóþ $rect".  ìîìåíò ñîçäàíèÿ êëàññà àâòîìàòè÷åñêè âûïîëíÿåòñÿ ñëóæåáíûé ìåòîä, ò.í. "êîíñòðóêòîð". Îí èìååò ôèêñèðîâàííîå èìÿ "__construct()", à òèï è êîëè÷åñòâî ïàðàìåòðîâ îïðåäåëÿåò ðàçðàáîò÷èê. Îñíîâíîå íàçíà÷åíèå êîíñòðóêòîðà - èíèöèàëèçàöèÿ âíóòðåííèõ ïåðåìåííûõ è ñâîéñòâ êëàññà. Åäèíñòâåííîå îòëè÷èå êîíñòðóêòîðà îò îáû÷íîãî ìåòîäà - êîíñòðóêòîð íå ìîæåò âîçâðàùàòü çíà÷åíèå. Ïðèìåð:
<?php // îáúÿâèëè êëàññ ñ êîíñòðóêòîðîì class DemoClass { private $a; private $b; private $c; private $d; public function __construct($a, $b, $c) { $this->a = $a; $this->b = $b; $this->c = $c; $this->d = 'my secret string'; } public function getSecret() { return $this->d; } } // ñîçäà¸ì ýêçåìïëÿð êëàññà $demo = new DemoClass('a', 'b', 'c'); // âûâîäèì ñåêðåòíóþ ñòðîêó echo $demo->getSecret(); // ñòðîêà 'my secret string' âûâîäèòñÿ, // õîòÿ ìû å¸ ÿâíî íå èíèöèàëèçèðîâàëè ?>
Ýêçåìïëÿðû êëàññîâ óäàëÿþòñÿ òàê æå, êàê âñå ïåðåìåííûå PHP - ïîñðåäñòâîì âûçîâà unset(). Ïðè óäàëåíèè ýêçåìïëÿðà àâòîìàòè÷åñêè âûçûâàåòñÿ åãî äåñòðóêòîð. Ýòî ñëóæåáíûé ìåòîä áåç ïàðàìåòðîâ ñ èìåíåì "__destruct()", â êîòîðîì ïðîãðàììèñò ìîæåò ÿâíî çàêðûòü è îñâîáîäèòü âñå ðåñóðñû, èñïîëüçóåìûå ýêçåìïëÿðîì. Ïî óìîë÷àíèþ, âñå ðåñóðñû ãàðàíòèðîâàííî îñâîáîæäàþòñÿ ïî îêîí÷àíèè âûïîëíåíèÿ ñêðèïòà.
ÎÎÏ - èíòåðåñíàÿ îáëàñòü PHP, íî èçó÷àòü å¸ â îòðûâå îò ïðàêòèêè î÷åíü ñëîæíî. Ïîýòîìó ñåé÷àñ ìû íå áóäåì âäàâàòüñÿ â òîíêîñòè è ïîäðîáíîñòè, à ðàññìîòðèì èõ ïîçæå ïðè ðåøåíèè ïðàêòè÷åñêèõ çàäà÷.