Объектом по PHP
Никита Кислицин
Xakep, номер #057, стр. 057-092-2
Понятие наследования четко связано с развитием языка. Предположим, есть некоторый объект "А", и мы хотим на его основе создать новый объект "Б", обладающий большим числом атрибутов. Тут на помощь и приходит механизм наследования. Говорят, что объект "Б" наследует объекту "А", если "Б" обладает всеми свойствами "А", а обратное не всегда верно, поскольку потомок обычно приобретает новые атрибуты. Возвращаясь к примеру из предыдущего абзаца, рассмотрим обычный модем и модем с поддержкой голосовых функций. Тут совершенно понятно, что голосовой модем наследует обычному, исходя из данного выше определения.
Класс - это шаблон для объекта. Он состоит из свойств и методов, которые показывают, что один объект отличается от другого и что он способен делать. Например, класс для модема мог бы состоять из нескольких свойств (скорость соединения, громкость динамика, используемый протокол связи) и методов (установить/разорвать соединение, передать данные и т.д.). Благодаря наследованию, мы без проблем можем наделить внешний модем функциями электробритвы (добавив методы, управляющие электродвигателем и бреющими решеточками). При этом различные объекты, создаваемые по одному классу, принято называть экземплярами. Биологическая трактовка здесь неуместна, поскольку в программировании наследование определено для классов, а не для конкретных экземпляров, как в живой природе.
Причем же здесь PHP?
Может показаться, что объектно-ориентированный подход применим лишь для системных языков программирования. Это не так, функции ООП присутствуют и в скриптовых языках типа Perl и PHP. И использовать объектный подход оказывается очень и очень удобно. Ниже я расскажу о семантике ООП в PHP и рассмотрю процесс создания несложного класса для работы с сетевыми соединениями через proxy-сервер.
Класс обычно описывается в виде отдельного файла, который потом подключается к сценарию. В PHP класс описывается следующим образом:
<?
class ClassName {
/* Ниже - определение свойств. Оператором var инициализируется параметр, его наличие обязательно */
var $a1="value1"; /* Свойство можно инициализировать некоторым значением по умолчанию */
var $a2; /* Но делать это необязательно */
/* Ниже - определение методов. Они вводятся ключевым словом function */
function func1($a3, $a4) {
/* здесь следует описание метода. Как видно, функция принимает два параметра, являющимися свойствами описываемого класса; вообще, для указания на создаваемый класс используется переменная $this (ведь у класса может быть множество экземпляров с самыми разными именами). */
} }
?>
Создание нового экземпляра класса реализуется при помощи оператора new:
$NewObject=new ClassName;
Теперь ссылаться на свойства и методы этого объекта можно уже известным способом: $NewObject->var1.
Наследование позволяет создавать новые классы путем добавления атрибутов к уже существующему классу. Это реализуется при помощи оператора extends:
<?
/* Ниже мы создадим новый класс ClassName, который унаследует все атрибуты ClassName, но будет иметь и собственные */