Пример 8 (наследование классов)
Классы и объекты
На основе материала из книги: Джон Каггзолл «PHP5 Полное руководство» Глава 13, стр. 296-323
Рассматриваемые вопросы:
- Создание классов и объектов.
- Уровни доступа к членам класса (public, private, protected)
- Конструкторы и деструкторы
- Константы классов
- Статические методы.
- Наследование классов
- Клонирование
- Абстрактные классы
Создание классов и объектов.
В объектно-ориентированном программировании (ООП) большинство всех задач связано с разработкой классов.
Класс является детальным проектом объекта, определяющим все действия, которые могут быть выполнены над ним.
Поэтому описание класса содержит все переменные (свойства), функции (методы), а также константы.
Описание класса похоже на описание структуры. Рассмотрим пример такого описания справедливый как для PHP4, так и для PHP5.
Пример 1
<?php
class myPHP4Class
{
var $my_variable;
function my_method($param)
{
echo "Вызван метод my_method($param)!\n";
echo "Значение внутренней переменной: ";
echo "{$this->my_variable}\n";
}
}
?>
$this – это особая переменная внутри класса, представляющая экземпляр самого объекта. Она используется для доступа к свойствам и методам внутри созданного объекта.
После определения класса можно приступать к созданию объектов (экземпляров) класса.
Для этого применяют оператор new.
Пример 2
<?php
include_once (”myPHP4Class_def.php”)
$myinstance = new myPHP4Class();
$anotherinstance = new myPHP4Class();
?>
Переменные $myinstance и $anotherinstance представляют объекты типа myPHP4Class. и не зависят друг от друга.
Обращение к свойствам и методам класса осуществляется операцией ->
Пример 3
<?php
include_once (”myPHP4Class_def.php”)
$myinstance = new myPHP4Class();
$anotherinstance = new myPHP4class();
$myinstance->my_variable = 10;
$anotherinstance->my_variable = 20;
$myinstance->my_method("MyParam");
?>
Уровни доступа к членам класса (public, private, protected)
В PHP4 все методы и свойства классов были общедоступными, т.е. имели уровень доступа public.
В PHP5 введены 3 уровня доступа к членам класса: public, private, protected.
Следовательно для PHP5 пример 1 должен выглядеть иначе: (хотя работать будет)
Пример 4
<?php
class myPHP5Class
{
public $my_variable;
public function my_method($param)
{
echo "Вызван метод my_method($param)!\n";
echo "Значение внутренней переменной: ";
echo "{$this->my_variable}\n";
}
}
?>
К членам класса public (общедоступные) доступ может быть осуществлен из любого места в пределах сценария. Их можно вызывать и изменять как внутри объекта ($this) так и за его пределами (имя объекта -> имя свойства или имя метода).
К членам класса private (закрытые) доступ может быть осуществлен только из экземпляра этого класса (объекта) с помощью переменной $this.
Перепишем пример 4, введя уровень доступа private.
Пример 5
<?php
class myPHP5Class
{
private $my_variable;
public function my_method($param)
{
echo "Вызван метод my_method($param)!\n";
echo "Значение внутренней переменной: ";
echo "{$this->my_variable}\n";
}
}
$myobject = new myPHP5Class();
$myobject-> my_method(“MyParam”); //допустимая запись
$myobject->my_variable = 10; //приведет к ошибке
?>
Конструкторы и деструкторы
Это функции, вызываемые во время создания экземпляра объекта (конструкторы) и его удаления (деструкторы). Назначение: инициализация объекта и освобождение занимаемой им памяти.
В PHP4 доступны были только конструкторы и имена их должны были совпадать с именем класса.
В PHP5 имя конструктора: __construct(), имя деструктора: __destruct().
Пример 6
<?php
class SimpleClass
{
function __construct($param)
{
echo "Создан новый экземпляр SimpleClass!";
}
function __destruct()
{
echo "Разрушен данный экземпляр SimpleClass";
}
}
$myinstance = new SimpleClass("value");
unset($myinstance); // оператор уничтожающий данную переменную
?>
Классическим примером использования конструкторов и деструкторов служит класс для доступа к серверной базе данных, где конструктор может отвечать за организацию соединения с базой данных, а деструктор – за его закрытие.
Константы классов
Константы классов – это нововведение в PHP5. Они позволяют определять постоянные значения в определениях класса. Такое определение константы осуществляется с помощью ключевого слова const, за которым следует имя константы и ее значение.
Пример 7
<?php
class ConstExample
{
private $myvar;
public $readme;
const MY_CONSTANT = 10;
public function showConstant()
{
echo "Значение: ".MY_CONSTANT;//Обратите внимание: нет $this (т.к. во всех объектах одинакова)
}
}
$inst = new ConstExample;
$inst->showConstant();
echo "Значение: ".ConstExample::MY_CONSTANT;
?>
Здесь показано использование констант классов как в самом классе, так и вне класса.
Обращение внутри класса к константе происходит напрямую.
Обращение к константе из вне класса осуществляется с помощью ссылки с указанием имени класса и имени константы в этом классе. (Формат: <Имя класса>::<Константа>).
Статические методы.
Статическими (static) называются методы, являющиеся частью класса, но созданные для вызова за пределами контекста конкретного экземпляра объекта. То есть статические методы можно вызывать когда не создан еще ни один объект. Возможность этого обусловлена запретом на использование в статических методах переменной $this, которая как было сказано ранее является ссылкой на объект.
Для создания статического метода перед его именем добавляется ключевое слово static.
static function myMetod()
{
………………………
}
Для вызова статического метода за пределами класса используется следующий синтаксис:
<Имя класса>::<Метод>
Что касается вызовов из содержимого объекта, то он также возможен и выглядит как обычный вызов метода объекта.
Наследование классов
Наследование это возможность расширять возможности одного класса (наследующего) функциональностью другого класса (наследуемого).
Когда один класс наследует другой, то все методы, свойства и константы родительского класса становятся доступными из класса-наследника. Однако при наследовании методов и свойств в классе наследнике будут доступны только те члены класса, которые были объявлены как public или protected. Чтобы один класс мог наследовать другой класс, в его определении ставится ключевое слово extends.
Пример 8 (наследование классов)
<?php
class ParentClass
{
public $parentvar;
public function parentOne()
{
echo "Called parentOne()\n";
}
private function parentTwo()
{
echo "Called parentTwo()!\n";
}
}
class ChildClass extends ParentClass
{
public function childOne()
{
echo "Called childOne()!\n";
}
/* В определении метода parentOne() нет необходимости,
так как он наследуется от класса ParentClass
parentTwo() не наследуется*/
}
$v = new ChildClass();
$v->parentOne();
?>
Итак, член класса объявленный как protected наследуется и будет доступен только в содержимом самого класса или любых его классов-наследников.
Член класса объявленный как private не наследуется и будет доступен только в содержимом самого класса.
Член класса объявленный как public наследуется и будет доступен в содержимом самого класса, любых его классов-наследников и извне.
Рассмотрим два примера: