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/.