Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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

ВВЕДЕНИЕ

 

PHP (рекурсивный акроним словосочетания Hypertext Preprocessor – «препроцессор гипертекста») – это скриптовый язык программирования, используемый для разработки web-приложений (сценариев), исполняемых на стороне web-сервера.

Данный язык был разработан в 1994 году, его создателем является программист Расмус Лердорф. В дальнейшем PHP получил широкое распространение по всему миру – множество сторонних разработчиков подключились к работе по совершенствованию языка. Таким образом, с 2004 года и по настоящее время используется пятая версия PHP. В данной версии полностью реализованы принципы объектно-ориентированного программирования, преимуществами которого (по сравнению с процедурным стилем) являются: высокая мобильность, простота модифицирования и сопровождения программ, снижение риска ошибок при программировании.

Целью данной курсовой работы является изучение основ объектно-ориентированного программирования в языке PHP.

В соответствии с поставленной целью можно выделить следующие задачи:

1) рассмотреть понятия класс и объект класса;

2) изучить принципы наследования в PHP;

3) ознакомиться со специальными методами для работы с классами.

 


ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В PHP

 

1.1 Класс как тип данных и объекты класса

 

Основными понятиями объектно-ориентированного программирования являются класс и объект. Класс – это своеобразный тип данных, определяемый самим пользователем; шаблон, по которому в дальнейшем будет создаваться объект. Объект – это некоторая сущность или экземпляр класса, имеющий определенный набор данных и методов. Данные описывают свойства объекта и представляют собой его переменные, а методы – это функции, принадлежащие объекту [1] или выполняемые им действия.

В языке PHP класс определяется с помощью зарезервированного слова class, после которого необходимо указать уникальное имя класса и тело класса (список свойств и методов) в фигурных скобках. Новые экземпляры класса создаются с помощью ключевого слова new, за которым следует название класса. Именем класса и объекта может быть любое не зарезервированное слово, которое должно начинаться с буквы латинского алфавита или символа подчеркивания, за которым может следовать любое количество букв, цифр или символов подчеркивания.

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

Кроме того, чтобы обратиться к свойствам и методам внутри объекта, необходимо использовать указатель $this – это переменная, которая неявно присутствует в каждом классе, является ссылкой на текущий объект класса [2].

Далее приведен пример кода, в котором описано создание класса Person и экземпляра этого класса – объекта person. Для всех будущих экземпляров класса установлены свойства name (имя), age (возраст) и методы setName(), setAge(), getName(), getAge(), которые позволяют заполнить соответствующие поля объекта необходимыми значениями, а затем получить их за счет использования переменной-указателя $this.

 

class Person {

public $name;

public $age;

public function setName($n){

$this->name = $n;

}

public function setAge($a){

$this->age = $a;

}

public function getName(){

return $this->name;

}

public function getAge(){

return $this->age;

}

}

 

$person = new Person();

$person->setName('Maria');

$person->setAge('20');

echo 'name: '.$person->getName().', age: '.$person->getAge();

 

Итогом выполнения операции echo станет вывод строки, содержащей значения полей name и age.

Нередко для создания объекта используют специальный метод – конструктор (__construct), который позволяет выполнить операции по инициализации тех или иных свойств объекта, а также вызвать другие методы. Вызов конструктора происходит автоматически каждый раз при создании экземпляра класса с помощью оператора new.

Помимо конструктора существует такой метод, как деструктор (__destruct), который применяется для удаления объекта и освобождения занимаемой ими памяти. Обычно его используют для выполнения различных служебных функций, например: закрытие файла, разрыв соединения с базой данных и т.д. Деструктор может быть вызван только в двух случаях: когда все ссылки на объект были закрыты и по завершении работы сценария [1].

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

 

 

class Person {

public $name;

public $age;

public function __construct($n, $a) {

$this->name = $n;

$this->age = $a;

}

public function __destruct() {

echo 'Объект '.$this->name.' удален <br />';

}

}

$person = new Person('Maria', '20');

 

Также, помимо методов __construct() и __destruct(), в пятой версии PHP введены специальные модификаторы доступа – эта характеристика позволяет контролировать, откуда именно к свойствам, методам и объектам можно получать доступ [3].

Область видимости может быть определена одним из трех ключевых слов:

1) public (общедоступные) – позволяет обращаться к свойствам и методам как внутри, так и вне класса;

2) protected (защищенные) – указывает, что доступ возможен только внутри самого класса, либо внутри его дочерних классов;

3) private (закрытые) – в данном случае элементы класса могут быть доступны только внутри того класса, в котором они определены.

В дополнении к установке области видимости, элементы класса могут быть объявлены как static (статические). Статические свойства и методы имеют отношение не к отдельному экземпляру, а ко всему классу в целом; таким образом, данные элементы класса доступны и без создания объектов.

 

1.2 Принципы наследования в PHP

 

Наследование является одним из трех важнейших механизмов объектно-ориентированного программирования, который позволяет описать новый класс на основе уже существующего; причем класс-наследник (дочерний, производный класс) наследует свойства и методы суперкласса (родительский или базовый класс). Кроме того, классы-наследники могут продолжать реализацию некоторых или всех методов и свойств родительского класса, чтобы обеспечить дополнительные или отличающиеся функциональные возможности [4].

Для того чтобы класс мог унаследовать элементы другого класса в PHP используется оператор extends. В следующем примере показано создание дочернего класса Student, который расширяет класс Person за счет добавления свойства vuz (название ВУЗа) и перегрузки метода showInfo(), который выводит строку со значениями name и vuz, принадлежащими некоторому объекту класса Student.

class Person {

public $name;

public $age;

public function __construct($n, $a) {

$this->name = $n;

$this->age = $a;

}

public function showInfo(){

echo 'name: '.$this->name. ', age: '.$this->age. '<br />';

}

}

 

class Student extends Person {

public $vuz;

function showInfo(){

echo $this->name. ' is student of '.$this->vuz. '<br />';

}

}

 

$person = new Person('Maria', '20');

$person->showInfo();

 

$stud = new Student('Ivan', '19');

$stud->vuz = 'NarFU';

$stud->showInfo();

 

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

Если же возникает необходимость в том, чтобы подкласс не только обратился к методам родительского класса, но и реализовал новую функциональность без переопределения данных методов, то для этого используют ключевое слово parent вместе с оператором разрешения видимости::.

Далее приведен пример, в котором показана реализация конструктора и метода showInfo() для класса-потомка Student путем обращения и модифицирования соответствующих методов класса-родителя Person.

 

 

class Person {

public $name;

public $age;

public function __construct($n, $a) {

$this->name = $n;

$this->age = $a;

}

public function showInfo(){

echo '<br />name: '.$this->name.', age: '.$this->age;

}

}

 

class Student extends Person {

public $vuz;

function __construct($n, $a, $v){

parent::__construct($n, $a);

$this->vuz = $v;

}

function showInfo(){

parent::showInfo();

echo ', vuz: '.$this->vuz. '<br />';

}

}

 

$stud = new Student('Anna', '19', 'NarFU');

$stud->showInfo();

 

В итоге при вызове метода showInfo() для объекта stud будет выведена строка, содержащая значения поля vuz, а также значения полей name и age.

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

Класс считается абстрактным, если в его объявлении содержится ключевое слово abstract. Кроме того, если класс содержит хотя бы один абстрактный метод, то весь класс должен быть объявлен как абстрактный. Также в PHP предусмотрены некоторые ограничения, которые позволяют избежать ошибок при использовании абстрактных классов. Во-первых, абстрактный метод нельзя вызвать, если он не был переопределен в производном классе [5]. Во-вторых, нельзя создать экземпляр класса, который был объявлен абстрактным. И, в-третьих, класс-наследник обязательно должен реализовать все абстрактные методы класса-родителя.

Ниже приведен пример, показывающий создание абстрактного класса Aperson, которому принадлежит абстрактный метод showInfo(). Его наследники – классы Student и Worker – реализуют данный метод, причем каждый по-своему.

abstract class Aperson{

function __construct($n, $a){

$this->name = $n;

$this->age = $a;

}

abstract function showInfo();

}

 

class Student extends Aperson {

public $vuz;

function showInfo(){

echo $this->name. ' is student of '.$this->vuz.'<br />';

}

}

 

class Worker extends Aperson {

public $job;

function showInfo(){

echo $this->name.' works in '.$this->job.'<br />';

}

}

 

$stud = new Student('Ivan', '20');

$stud->vuz = 'NarFU';

$stud->showInfo();

 

$worker = new Worker('Olga', '30');

$worker->job = 'Gazprom';

$worker->showInfo();

 

Таким образом, при вызове метода showInfo() для экземпляра класса Student будет выведена строка, содержащая значения полей name и vuz, а для экземпляра класса Worker – строка со значениями name и job.

В языке PHP существует такое понятие, как интерфейс. Интерфейс – это обычный абстрактный класс, шаблон, определяющий функциональность (поведение) всех классов, которые наследуют его. Как и в случае с абстрактным классом, класс-наследник, реализующий интерфейс, обязан содержать в себе определения всех методов, заявленных в интерфейсе [5]. В тоже время есть ряд особенностей, которые отличают интерфейс от абстрактного класса. Во-первых, интерфейс не содержит свойства экземпляров класса, только их методы. Во-вторых, все методы, указанные в интерфейсе, являются абстрактными, поэтому ни один метод не должен быть описан. И, в-третьих, класс-наследник может реализовывать несколько интерфейсов одновременно, таким образом, обеспечивается поддержка множественного наследования.

Интерфейс объявляют с помощью ключевого слова interface, а для того чтобы класс реализовал интерфейсы, используют слово implements, после которого указывают список имен интерфейсов.

Далее приведен пример кода, в котором показана реализация интерфейса Iperson, содержащего методы save() и info(), в классах Student и Worker.

interface Iperson {

public function save();

public function info();

}

 

class Student implements Iperson {

private $name;

private $vuz;

private $course;

public function __construct($n, $v, $c) {

$this->name = $n;

$this->vuz = $v;

$this->course = $c;

}

public function save() {

echo 'Student '.$this->name.' is saved<br />';

}

public function info () {

echo $this->name.' is student of '.$this->vuz;

}

}

 

class Worker implements Iperson {

private $name;

private $job;

private $career;

public function __construct($n, $j, $c) {

$this->name = $n;

$this->job = $j;

$this->career = $c;

}

public function save() {

echo 'Worker '.$this->name.' is saved<br />';

}

public function info () {

echo $this->name.' works as a '.$this->career.' in '.$this->job;

}

}

 

$stud = new Student('Ivan', 'NarFU', '2');

$stud->info();

$worker = new Worker('Olga', 'Gazprom', 'secretary');

$worker->info();

 

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

 

1.3 Специальные методы для работы с классами

 

Помимо специальных методов __construct() и __destruct(), конструктора и деструктора, в языке программирования PHP предусмотрен ряд других методов, предназначенных для работы с классами, – так называемые «магические методы» (от англ. magic methods). Данные методы являются достаточно гибким инструментом – с их помощью программист может существенно влиять на поведение объектов. К таким методам относят:

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

class Person {

public $name;

public $status;

function __construct($n, $s) {

$this->name = $n;

$this->status = $s;

}

function __clone(){

$this->status = ‘married’;

}

function info(){

echo 'name:'.$this->name.', status:'.$this->status.'<br/>';

}

}

 

$person1 = new Person('Alice','single');

$person1->info();

$person2 = clone $person1;

$person2->info();

 

В данном случае была создана копия объекта person1 – объект person2, для которого в методе __clone() было переопределено значение свойства status.

2) метод __toString() предназначен для упрощения строкового представления сложного объекта [4], например:

class Person {

public $name;

function __construct($n) {

$this->name = $n;

}

function __toString(){

return $this->name;

}

}

$person1 = new Person('Alice');

echo $person1;

 

В этой ситуации вызов оператора echo не приведет к выводу фатальной ошибки, т.к. при описании класса Person был определен метод __toString().

3) реализованная в коде скрипта функция __autoload() будет вызываться автоматически при использовании классов, которые ранее не были определены. Таким образом, данная функция – с помощью операторов include(), include_once(), require() и require_once() – позволяет загрузить файл, содержащий определение класса, до того, как выполнение кода скрипта прервется сообщением об ошибке.

4) метод-получатель __get() будет вызван в тот момент, когда произойдет обращение к несуществующему свойству объекта класса, а метод-установщик __set() – когда несуществующему свойству будет присваиваться некоторое значение. Например:

class Example {

function __set($name, $val) {

echo 'Попытка присвоить '.$val.' Переменной '.$name;

}

function __get($name) {

echo 'Попытка обратиться к переменной '.$name;

}

}

$exam = new Example();

$exam->number = 100;

echo $exam->txt;

 

При выполнении данного кода будут выведены две строки: «Попытка присвоить 100 переменной number» и «Попытка обратиться к переменной txt».

В свою очередь, метод __call() вызывается в тот момент, когда происходит обращение к несуществующему методу. Например:

class Example{

function __call($name, $params){

$string = implode(", ", $params);

echo 'Попытка вызвать метод '.$name.' с параметрами: '.$string;

}

}

$exam = new Example();

$exam->someMethod('param1','param2');

 

Данный скрипт выведет следующую строку «Попытка вызвать метод someMethod с параметрами: param1, param2».

Таким образом, методы __get(), __set() и __call() полезно использовать в тех случаях, когда до начала выполнения сценария сложно определить весь список требуемых свойств и методов. Обычно это происходит при работе с Web-службами или контейнерными объектами.

5) методы __sleep() и __wake up () напрямую связаны с функциями serialize и unserialize , а именно: метод __sleep() будет вызван строго перед тем, как объект сериализуется (serialize), а метод __wakeup() – после того, как объект десериализуется (unserialize).

Обычно метод __sleep() используют для того, чтобы вернуть строку – список полей класса, в тоже время некоторые поля могут быть исключены из строкового представления объекта. Метод __wake up () используют для восстановления объекта или соединения с базой данных, которое было потеряно во время сериализации.

Ниже приведен код скрипта, в котором показан пример использования методов __sleep() и __wake up () .

class Person {

public $name;

public function __sleep() {

echo 'Вызов метода __sleep()…<br />';

return array('name');

}

public function __wakeup() {

echo 'Вызов метода __wakeup()…<br />';

}

}

$person1 = new Person();

$person1->name = 'Maria';

 

$str = serialize($person1);

echo 'Объект переведен в строку: '.$str. '<br />';

$person2 = unserialize($str);

echo 'Строка переведена в объект <br />';


ЗАКЛЮЧЕНИЕ

 

В ходе выполнения данной курсовой работы были изучены основы объектно-ориентированного программирования в языке PHP. При этом в соответствии с поставленными задачами были даны понятия класс и объект класса, рассмотрены правила объявления классов и создания объектов класса, описаны модификаторы доступа и их назначение.

Кроме того были рассмотрены основные конструкции языка, используемые при описании наследования классов, были изучены такие понятия, как абстрактные классы и интерфейсы, их назначение и особенности использования.

В итоге выполнения работы были описан ряд специальных «магических» методов, которые позволяют влиять на поведение объектов в ходе выполнения скрипта кода.


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...