|
- Содержание
- class
-
extends
-
Constructors
-
::
-
parent
- Сериализация объектов - объекты сессий
- Магические функции __sleep и __wakeup
- Ссылки внутри конструктора
Класс это коллекция переменных и функций, работающих с этими переменными.
Класс определяется с использованием следующего синтаксиса: <?php
class Cart
{
var $items; //элементы в нашей shopping cart
// Добавить $num артикулов $artnr в cart
function add_item ($artnr, $num)
{
$this->items[$artnr] += $num;
}
// Изъять $num артикулов $artnr из cart
function remove_item ($artnr, $num)
{
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?> |
Здесь определён класс Cart, состоящий из ассоциативного массива артикулов/articles
в карте/cart и двух функций для добавления и удаления элементов этой cart.
Внимание! |
---|
Это предупреждение верно для PHP 4. Имя stdClass используется внутренне
Zend-машиной и зарезервировано. Вы не можете иметь в РНР класс с именем
stdClass. Имена функций __sleep и __wakeup являются "магическими" в PHP-классах. Вы не можете иметь функции с такими же
именами в любом вашем классе, если только вам не нужна "магическая"
функциональность, ассоциированная с ними. См. далее.
PHP резервирует все имена функций, начинающиеся с __ как магические.
Рекомендуем не использовать в РНР имена функций с __ , если только
вам не нужна какая-нибудь задокументированная магическая функциональность. |
Примечание: в PHP 4 только константные инициализаторы для var-переменных допустимы.
Для инициализации переменных с неконстантными значениями
вам необходима функция инициализации, которая вызывается
автоматически, когда конструируется из класса. Такая функция называется конструктором (см. далее).
<?php
/* Это не будет работать в PHP 4. */
class Cart
{
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;
function Cart()
{
$this->todays_date = date("Y-m-d");
$this->name = $GLOBALS['firstname'];
/* etc. . . */
}
}
?> |
Классы это типы, то есть они являются шаблонами реальных переменных. Вы
должны создавать переменную нужного типа операцией 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 вызывается для добавления 1 элемента артикула номер 10 в
$cart. 3 элемента артикула номер 0815 добавляются в $another_cart.
И $cart, и $another_cart имеют функции add_item(),
remove_item() и элементы переменных. Это разные функции и переменные. Вы
можете представить эти объекты как директории файловой системы. В файловой
системе вы можете иметь два разных файла README.TXT, если они находятся в разных
директориях. Как и с директориями, где необходимо вводить полный путь к
файлу, чтобы достичь его из директории верхнего уровня, вы должны
специфицировать полное имя функции, которую хотите вызвать: в терминологии PHP,
директория верхнего уровня это глобальное пространство имён/global namespace, а разделителем имён служит ->.
Таким образом, имена $cart->items и $another_cart->items именуют
две различные переменные. Заметьте, что переменная именуется $cart->items,
а не $cart->$items, то есть имя переменной в PHP имеет только один знак dollar.
// корректно, один символ $
$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 в самом
классе Cart. Вместо этого, чтобы иметь возможность доступа к переменным и
функциям внутри класса, можно использовать псевдопеременную $this, которая может читаться как 'моя собственная' или
'текущий объект'. То есть '$this->items[$artnr] += $num' можно прочитать
как 'добавить $num к счётчику $artnr элемента моего собственного массива'
или 'добавить $num к счётчику $artnr элемента массива внутри текущего объекта'.
Примечание:
имеются отличные функции для работы с классами и объектами. Вы можете просмотреть их в разделе
Class/Object-функции.
| |