| PHP Ръководство | ||
|---|---|---|
| Предишна страница | Следваща страница | |
Класът е набор от променливи и функции, които работят с тези променливи. Променливите се дифинират с ключовата дума var, а функциите с function. Дефиницията на клас има следният синтаксис:
<?php
class Cart {
var $items; // Артикули в нашата пазарска количка
// Добавяне на $num артикули от $artnr към пазарската количка
function add_item($artnr, $num) {
$this->items[$artnr] += $num;
}
// Премахване на $num артикула от $artnr от пазарската количка
function remove_item($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} elseif ($this->items[$artnr] == $num) {
unset($this->items[$artnr]);
return true;
} else {
return false;
}
}
}
?> |
В примера по-горе е дефиниран клас Cart, който се състои от асоциативен масив от артикули на пазарска количка и две функции за добавяне и премахване на артикули от тази пазарска количка.
| Внимание |
|
Не може дефиницията на клас да се помества в множество файлове. Също така не може дефиницията на клас да се помества в множество PHP блока, освен ако прекъсването не е в декларацията на метод. Следният пример няма да работи:
Следното обаче е позволено:
|
Следните предупредителни забележки са валидни за PHP 4.
| Внимание |
|
Наименованието stdClass се използва вътрешно от Zend и е запазено. Не можете да имате клас имеуван stdClass в PHP. |
| Внимание |
|
Имената на функциите __sleep и __wakeup са вълшебни в PHP класовете. Не може да имате функции с тези имена във вашите класове, освен ако не искате да ползвате вълшебната функционалност свързана с тях. Вижте по-долу за повече информация. |
| Внимание |
|
PHP запазва всички имена на функции започващи с __ като магически. Препоръчително е да не използвате имена на функции в PHP започващи с __, освен ако не искате да ползвате документираната вълшебна функционалност. |
В PHP 4 var променливите на класовете могат да се инициализират само с константни стойности. За да се инициализира променлива с неконстантна стойност, трябва да се използва инициализационна функция, която се извиква автоматично при инстанциирането на класа. Таква функция се нарича конструктор (вижте по-долу).
<?php
class Cart {
/* Нито една от долните конструкции няма да работи в PHP 4. */
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
/* Масивите съдържащи константни стойности ще работят. */
var $items = array("VCR", "TV");
}
/* Това е начинът да се направи. */
class Cart {
var $todays_date;
var $name;
var $owner;
var $items = array("VCR", "TV");
function Cart() {
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* и т.н. */
}
}
?> |
Класовете са типове, което означава, че са шаблони за действителните променливи. Можете да създадете променлива от желаният от вас тип чрез оператораnew
<?php
$cart = new Cart;
$cart->add_item("10", 1);
$another_cart = new Cart;
$another_cart->add_item("0815", 3);
?> |
В горният пример се създават обектите
$cart и $another_cart
като и двата са инстанции на клас Cart. Функцията add_item() на
обекта $cart се извиква за да се добави
един артикул с номер 10 към $cart.
Също така се добавят 3 артикула с номер 0815
към $another_cart.
И двата обекта, $cart и $another_cart
притежават функции add_item(), remove_item() и променливи. Можете да си
представите обектите като нещо подобно на директориите в една файлова система.
В една файлова система можете да имате 2 отделни файла README.TXT,
стига да се намират в различни директории. Също както при директориите ще трябва да
въведете пълният път до файла за да имате достъп до него от главната директория,
трябва да зададете пълното име на функцията която искате да извикате:
в контекста на PHP, главната директория ще бъде глобалното пространство от имена,
и разделителя в името на пътя се явява ->. По този начин,
$cart->items и $another_cart->items
са две различни променливи. Забележете, че променливата е
$cart->items, а не $cart->$items,
което означава, че името променливата в PHP трябва да има само един знак $.
<?php
// правилно, единичен $
$cart->items = array("10" => 1);
// невалидно, понеже $cart->$items става $cart->""
$cart->$items = array("10" => 1);
// правилно, но резултата може да не е този, който очакваме:
// $cart->$myvar става $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);
?> |
В дефиницията на класа вие не знаете името на обекта който ще го инстанциира:
по времето на написването на класа Cart не се знаеше, че по-късно обекта ще се
именува $cart или $another_cart.
Следователно няма как да напишете $cart->items
в самият клас. Вместо това, за да имаме достъп до собствените функции
и променливи на класа, може да се използваме псевдо-променливата
$this, която е референция към обекта който е инстанциирал класа.
Следователно '$this->items[$artnr] += $num'
може да се бъде прочетено като 'добави $num към брояча
$artnr на артикулите на моят масив' или 'добави
$num към брояча $artnr на артикулите на
масива за текущия обект'.
Забележка: Псевдо-променливата
$thisобикновено не е дефинирана ако метода в който се намира е извикан статично. Това все пак не е стриктно правило:$thisе дефинирана ако метода е извикан статично от друг обект. В този случай, стойността на$thisе тази на извикващият обект. Това е илюстрирано със следният пример:
<?php class A { function foo() { if (isset($this)) { echo '$this е дефинирана ('; echo get_class($this); echo ")\n"; } else { echo "\$this не е дефинирана.\n"; } } } class B { function bar() { A::foo(); } } $a = new A(); $a->foo(); A::foo(); $b = new B(); $b->bar(); B::bar(); ?>Примерът по-горе ще изведе:
$this е дефинирана (a) $this не е дефинирана. $this е дефинирана (b) $this не е дефинирана.
Забележка: Съществуват няколко функции за работа с класове и обекти. Можете да ги разгледате в раздел Функции за Класове и Обекти.
| Предишна страница | Начало | Следваща страница |
| Вътрешни (вградени) функции | Начало на раздела | extends |