PHP и объектно-ориентированное программирование

 

Класс - это абстрактный тип данных, разрабатываемый пользователем. Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки. Свойства и методы называются членами класса. Если класс можно рассматривать как тип данных, то объект — как переменную (по аналогии). Скрипт может одновременно работать с несколькими объектами одного класса, как с несколькими переменными. Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта.

Описание классов в PHP начинаются служебным словом class:

class Имя_класса {

// описание членов класса - свойств и методов для их обработки

}

Для объявления объекта необходимо использовать оператор new:

Объект = new Имя_класса;

Данные описываются с помощью служебного слова var. Метод описывается так же, как и обыкновенная пользовательская функция. Методу также можно передавать параметры.

По общепринятым правилам имена классов ООП начинаются с прописной буквы, а все слова в именах методов, кроме первого, начинаются с прописных букв (первое слово начинается со строчной буквы). Разумеется, вы можете использовать любые обозначения, которые сочтете удобными; главное — выберите стандарт и придерживайтесь его.

В листинге 2.19 приведен пример класса на PHP.

Листинг 2.19 Пример класса на PHP:

<?php

// Создаем новый класс Coor:

class Coor {

// данные (свойства):

var $name;

var $addr;

// методы:

function Name() {

echo "<h3>John</h3>";

}

}

// Создаем объект класса Coor:

$object = new Coor;

?>

 

Доступ к членам класса PHP осуществляется оператором ->.

В листинге 2.18 приведен пример доступа к членам класса на PHP

Листинг 2.18 Доступ к членам класса на PHP

<?php

// Создаем новый класс Coor:

class Coor {

// данные (свойства):

var $name;

// методы:

function Getname() {

echo "<h3>John</h3>";

}

}

// Создаем объект класса Coor:

$object = new Coor;

// Получаем доступ к членам класса:

$object->name = "Alex";

echo $object->name;

// Выводит 'Alex'

// А теперь получим доступ к методу класса (фактически, к функции внутри класса):

$object->Getname();

// Выводит 'John' заглавными буквами

?>

Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, которы всегда относится к текущему объекту. Модифицированный метод Getname():

function Getname() {

echo $this->name;

}

Таким же образом, можно написать метод Setname():

function Setname($name) {

$this->name = $name;

}

Теперь для изменения имени можно использовать метод Setname():

$object->Setname("Peter");

$object->Getname();

Конструктор - метод, который задает значения некоторых свойств (а также может вызывать другие методы). Конструкторы вызываются автоматически при создании новых объектов. Имя метода-конструктора должно совпадать с именем класса, в котором он содержится.

В листинге 2.19 приведен пример конструктора

Листинг 2.19 Конструктор

<?

class Webpage {

var $bgcolor;

function Webpage($color) {

$this->bgcolor = $color;

}

}

// Вызвать конструктор класса Webpage

$page = new Webpage("brown");

?>

Раньше создание объекта и инициализация свойств выполнялись раздельно. Конструкторы позволяют выполнить создание объекта и инициализацию свойств за один этап.

В зависимости от количества передаваемых параметров могут вызываться разные конструкторы. В рассмотренном примере объекты класса Webpage могут создаваться двумя способами. Во-первых, вы можете вызвать конструктор, который просто создает объект, но не инициализирует его свойства:

$page = new Webpage;

Во-вторых, объект можно создать при помощи конструктора, определенного в классе, — в этом случае вы создаете объект класса Webpage и присваиваете значение его свойству bgcolor:

$page = new Webpage("brown");

В РНР отсутствует непосредственная поддержка деструкторов. Тем не менее, вы можете легко имитировать работу деструктора, вызывая функцию РНР unset(). Эта функция уничтожает содержимое переменной и возвращает занимаемые ею ресурсы системе. С объектами unset() работает так же, как и с переменными. Допустим, вы работаете с объектом $Webpage. После завершения работы с этим конкретным объектом вызывается функция:

unset($Webpage);

Эта команда удаляет из памяти все содержимое $Webpage. Действуя в духе инкапсуляции, можно поместить вызов unset() в метод с именем destroy() и затем вызвать его:

$Website->destroy();

Необходимость в вызове деструкторов возникает лишь при работе с объектами, использующими большой объем ресурсов, поскольку все переменные и объекты автоматически уничтожаются по завершении сценария.

Иногда возникает необходимость выполнить инициализацию объекта - присвоить его свойствам первоначальные значения. Предположим, имя класса Coor и он содержит два свойства:имя человека и город его проживания. Можно написать метод (функцию), который будет выполнять инициализацию объекта, например Init():

В листинге 2.20 приведен пример инициализации объекта.

Листинг 2.20 Инициализация объекта

<?php

// Создаем новый класс Coor:

class Coor {

// данные (свойства):

var $name;

var $city;

// Инициализирующий метод:

function Init($name) {

$this->name = $name;

$this->city = "London";

}

}

// Создаем объект класса Coor:

$object = new Coor;

// Для инициализации объекта сразу вызываем метод:

$object->Init();

?>

Для того, чтобы PHP знал, что определенный метод нужно вызывать автоматически при создании объекта, ему нужно дать имя такое же, как и у класса (Coor):

function Coor ($name)

$this->name = $name;

$this->city = "London";

}

Метод, инициализирующий объект, называется конструктором. Однако, PHP не имеет деструкторов, поскольку ресурсы освобождаюся автоматически при завершении работы скриптов.

Обращение к элементам классов осуществляется с помощью оператора :: "двойное двоеточие". Используя "двойное двоеточие", можно обращаться к методам классов.

При обращении к методам классов, программист должен использовать имена этих классов.

В листинге 2.21 приведен пример обращения к методам класса

Листинг 2.21 Обращение к методам класса

<?php

class A {

function example() {

echo "Это первоначальная функция A::example().<br>";

}

}

class B extends A {

function example() {

echo "Это переопределенная функция B::example().<br>";

A::example();

}

}

// Не нужно создавать объект класса A.

// Выводит следующее:

// Это первоначальная функция A::example().

A::example();

// Создаем объект класса B.

$b = new B;

// Выводит следующее:

// Это переопределенная функция B::example().

// Это первоначальная функция A::example().

$b->example();

?> /14, 15/.