Это создание копии объекта.

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

На основе материала из книги: Джон Каггзолл «PHP5 Полное руководство» Глава 13, стр. 296-323

 

Рассматриваемые вопросы:

  1. Создание классов и объектов.
  2. Уровни доступа к членам класса (public, private, protected)
  3. Конструкторы и деструкторы
  4. Константы классов
  5. Статические методы.
  6. Наследование классов
  7. Клонирование
  8. Абстрактные классы

Создание классов и объектов.

В объектно-ориентированном программировании (ООП) большинство всех задач связано с разработкой классов.

Класс является детальным проектом объекта, определяющим все действия, которые могут быть выполнены над ним.

Поэтому описание класса содержит все переменные (свойства), функции (методы), а также константы.

Описание класса похоже на описание структуры. Рассмотрим пример такого описания справедливый как для 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 наследуется и будет доступен в содержимом самого класса, любых его классов-наследников и извне.

 

Рассмотрим два примера:

 

Пример 9 (перегрузка члена класса)

<?php

Class ParentClass

{

public function callMe()

{

echo "Вызван родительский класс!\n";

}

}

 

class ChildClass extends ParentClass

{

public function callMe()

{

echo "Вызван дочерний класс!\n";

}

}

 

$child = new ChildClass;

$child->callMe();

?>

Здесь вызван будет метод из класса ChildClass. Действует принцип предпочтения локального члена класса.

 

Пример 10 (Связывание члена класса в PHP)

<?php

Class ParentClass

{

public function callMe()

{

$this->anotherCall();

}

 

public function anotherCall()

{

echo "Вызван родительский класс!\n";

}

}

 

class ChildClass extends ParentClass

{

public function anotherCall()

{

echo "Вызван дочерний класс!\n";

}

}

 

$child = new ChildClass;

$child->callMe();

?>

При вызове метода callMe()поскольку таковой отсутствует в классе ChildClass, будет вызван метод, определенный в родительском классе ParentClass. В нем в свою очередь есть вызов метода anotherCall() чере переменную $this. Какой метод будет вызван? Принадлежащий родительскому классу или классу наследнику из объекта которого и началась эта цепочка вызовов. Ответ – из класса наследника. Это объясняется тем, что переменная $thisвсегда будет ссылаться на экземпляр класса, который производит вызов метода класса (в данном случае ChildClass), независимо от того, где находится код в котором присутствует переменная $this.

 

 

Клонирование

Это создание копии объекта.

В PHP4

<?php

$class_one = new MyClass();

$class_one_copy = $class_one; //такая запись в PHP5 $class_one_copy будет ссылкой на $class_one и //изменения в $class_one будут отражаться на содержимом $class_one_copy и наоборот.

 

?>

В PHP5

<?php

$class_one = new MyClass();

$class_one_copy = clone $class_one; //с использованием оператора clone

//$class_one_copy будет самостоятельной копией $class_one и изменения в $class_one не будут отражаться на //$class_one_copy

?>

Важное отличие PHP5 от PHP4: