Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Веб программирование.Начало пути.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
7.81 Mб
Скачать

Классы и Объекты

Модель объектов PHP больше похожа на модель объектов Java, чем на модель C++. Класс представляет объединение переменных и функций-методов, работающих с этими переменными. Переменные класса определяются с ключевым словом var как в PHP4 или со спецификатором доступа private, public или protected как в PHP5. Методы определяются в классе с ключевым словом function и спецификатором доступа. Рассмотрим пример:

<?php

class Mycart

{//var $items=0; в PHP4

private $items=0; //переменные класса в PHP5

public function add ($n) // Добавить $n артикулов

{

$this->items += $n;

}

public function remove ( $n) // Изъять $n артикулов

{

if ($this->items > $n) {

$this->items -= $n;

return true; }

else { return false; }

}

public function show()

{

echo '$items=', $this->items ;

}

}//конец класса

$instance=new Mycart();

$instance->add(5);

$instance->remove(2);

$instance->show();

echo $instance->items ;//ошибка

?>

Вывод:

$items=3

Fatal error: Cannot access private property Mycart::$items in x:\home\localhost\www\my\pr41.php on line 25 – нет доступа к private переменной items

Здесь $instance представляет ссылку на объект класса, сам объект создается операцией new. Каждый объект получает собственный числовой идентификатор (handler), который используется при обращении к объекту.

Чтобы иметь возможность доступа к переменным и функциям внутри класса, можно использовать псевдопеременную $this, которая может читаться как 'ссылка на текущий объект'.

В PHP 5 введены спецификаторы доступа public, protected и private, которые позволяют указать степень доступа к свойствам и методам класса.

К общедоступным (public) свойствам и методам можно получить доступ без каких либо ограничений. Защищенные (protected) элементы класса доступны внутри класса, в котором они объявлены, и в производных (наследуемых) от него классах.

Частные (private) элементы доступны только методам в классе, в котором они объявлены.

Если не указывать ни один из спецификаторов, то по умолчанию элемент будет иметь уровень доступа public. Такой же уровень доступа по умолчанию получают свойства, для объявления которых использовалось устаревшее и не рекомендуемое к использованию в PHP 5 ключевое слово var, а спецификатор доступа не используется. Это сделано для переемственности с PHP4.

Конструкторы и деструкторы

В PHP допустимы только константные инициализаторы для переменных класса. Для инициализации переменных класса используется функция инициализации, которая вызывается автоматически при создании объекта класса. Такая функция называется конструктором. Метод-конструктор вызывается автоматически при каждом создании объекта. В PHP4 имя этой функции совпадает с именем класса. В PHP 5 конструктором класса является метод __construct(). При уничтожении объекта вызывается специальный метод __destruct() – деструктор класса.

<?php //pr21

class MyClass {

private $property;

function _construct() {

echo "Запущен конструктор";

}

function __destruct() {

echo "Запущен деструктор";

}

function MyClass($n=1) {

echo "Запущен другой конструктор";

$this->property=$n;

}

}

$obj = new MyClass(); // Выводит "Запущен конструктор"

unset($obj); // Выводит "Запущен деструктор"

$obj1 = new MyClass(10);

?>

Запущен конструктор Запущен деструктор Запущен конструктор Запущен деструктор

Конструкторы PHP4, имена которых совпадают с именами классов, будут работать с PHP5 без изменений кода. Для совместимости с предыдущей версией PHP 5 поступает следующем образом: если при создании объекта в классе не найдется конструктора __construct(), то PHP пытается выполнить метод, имя которого совпадает с именем класса.

В приведенном выше примере конструктор не перегружается, а вызывается первый конструктор.

В случае наследования классов конструктор базового класса при создании порожденного класса неявно не вызывается. Если необходимо вызвать конструктор или деструктор базового класса из порожденного класса, это нужно сделать явно, через указатель parent.

<?php //pr22

class MyClass {

function __construct() {

echo "конструктор базового класса";

}

function __destruct() {

echo " деструктор базового класса";

}

}

class DerivedClass extends MyClass {

function __construct() {

echo "конструктор порожденного класса";

parent::__construct();

}

function __destruct() {

echo " деструктор порожденного класса";

parent::__destruct();

}

}

$obj = new DerivedClass();

unset($obj);

?>

Вывод:

конструктор порожденного класса конструктор базового класса

деструктор порожденного класса деструктор базового класса

Рассмотрим еще один пример вывода даты/времени:

<?php

class Dateclass {

var $month=array( "Январ", "Феврал", "Март", "Апрел", "Ма", "Июн", "Июл","Август","Сентябр", "Октябр", "Декабр", "Январ");

var $day=array ( "Воскресенье", "Понедельник", "Вторник","Среда", "Четверг" , "Пятница" , "Суббота");

var $dnum; var $mnum; // Переменные класса

var $daym; var $year;

function Dateclass() { //Конструктор: инициализация переменных

$this->dnum = date("w");

$this->mnum = date("n");

$this->daym = date("d");

$this->year = date("Y");

}

function show(){// метод

$dnum =$this->dnum;

$mnum = $this->mnum;

$daym =$this->daym;

$year = $this->year;

$textday =$this->day[$dnum];

$monthm =$this->month[$mnum-1];

if ($mnum==3||$mnum==8)

{ $k="а"; }

else {$k="я";}

echo "Сегодня: $textday, $daym $monthm$k $year г.";

}

}

$obj=new Dateclass();// Создание объекта

$obj->show();//Вызов метода из объекта

?>

Результат:

Сегодня: Воскресенье, 05 Апреля 2009 г.

В PHP объекты представляют объектные ссылки, передача объекта в качестве параметра функции происходит по ссылке, а не по значению. Если необходимо провести копирование объекта, то используется клонирование объекта со всеми методами, свойствами и значениями:

<?php //pr24

class MyClass{

public $property=1;

}

$obj1 = new MyClass;

$obj2=$obj1;//ссылка на тот же объект

echo $obj1->property; // Выводит 1

$obj2->property = 2;

echo $obj1->property; // Выводит 2

$obj3 = clone $obj1;//создание нового объекта

echo $obj3->property; // Выводит 2

$obj3->property = 3;

echo $obj1->property; // Выводит 2

?>

Для копирования объекта используется ключевое слово clone, которое вызывает метод __clone() и к которому нельзя обратиться непосредственно. Метод __clone() необязательно описывать в классе, однако его перегрузка, позволит изменить значения свойств копируемого объекта:

<?php

class MyClass{

var $property;

function __clone() {

$this->property = 2;

}

}

$obj1 = new MyClass;

$obj1->property = 1;

$obj2 = clone $obj1;

echo $obj1->property; // Выводит 1

echo $obj2->property; // Выводит 2

?>

Метод __clone() не может принимать никакие аргументы, однако позволяет обратиться к исходному объекту через указатель $this и получаемому в результате копирования объекту через указатель $that.