Пятница, 19.04.2019, 09:19
Приветствую Вас Гость

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

Меню сайта
Категории раздела
Наш опрос
Оцените мой сайт
Всего ответов: 2
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » 4. Лабораторные работы » Лабораторная работа ч.2 по объектно-ориентированному программированию на PHP

Лабораторная работа ч.2 по объектно-ориентированному программированию на PHP

Лабораторная работа ч.2 по объектно-ориентированному программированию на PHP

Это вторая часть лабораторной работы по ООП, где мы будем продолжать изучать объектно-ориентированное программирование на примерах. С первой частью можно ознакомится здесь — лабораторная работа по ООП в PHP часть 1.

Итак, мы остановились на изучении такого понятия, как конструктор. Давайте, прежде чем двигаться дальше, я еще пару слов скажу про этот архиполезный метод.

 

Данный метод есть во всех языках программирования, но в PHP он обозначается именно, как нижнее двойное подчеркивание construct. Это метод автоматически вызываемый. Для чего используется конструктор? Для инициализации чего-либо. Например, когда создается новый объект, мы хотим чтобы, что-то происходило (что-то в сессию записывалось, кука посылалась, в файл что-нибудь записывалось). То есть, что-то происходило автоматически. Это очень похоже на автозагрузку операционной системы. Загрузилась операционная система и вместе с ней произошли какие-то действия, загрузились программы и т.д. Здесь тоже самое.

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

Для этого у нас есть метод, который называется деструктор. Этот метод автоматически вызывается при удалении объекта. В PHP он обозначается, как двойное нижнее подчеркивание destruct (__destruct):

<?php
class Users{
 public $name;
 public $login;
 public $password;
 
 //создание конструктора
 function __construct($number){
 echo "<p>Конструктор вызвался автоматически $number!";
 }
 
 //создаем деструктор
 function __destruct(){
 echo "<p>Объект удалился!";
 }
 
 //создаем методод getInfo()
 function getInfo(){
 echo "<p>Name: ".$this->name."<br>";
 echo "Login: ".$this->login."<br>";
 echo "Password: ".$this->password."<br>";
 }
}

$user1 = new Users(1);
 $user1->name = "Vasya";
 $user1->login = "vas";
 $user1->password = 123;
 //выводим метод getInfo()
 $user1->getInfo();

$user2 = new Users(2);
 $user2->name = "Petya";
 $user2->login = "pet";
 $user2->password = 321;
 //выводим метод getInfo()
 $user2->getInfo();

$user3 = new Users(3);
 $user3->name = "Vova";
 $user3->login = "vov";
 $user3->password = 456;
 //выводим метод getInfo()
 $user3->getInfo();
?>

Запустив этот код, мы видим, что при удалении объектов, а они удаляются у нас здесь автоматически, вызывается деструктор с записью — Объект удалился. У нас было три объекта — соответственно выводятся три раза запись — «Объект удалился!».

Обратите внимание, что деструктор имеет круглые скобки, но передавать параметры в эти круглые скобки нельзя! Еще один важный момент — порядок удаления объектов не определен, никогда. То есть у нас есть три объекта и их надо удалить. Так вот в каком порядке они будут удаляться, это не определено. Поэтому есть такое правило — из деструктора не обращаться к другим объектам, так как на момент вызова объекта, он может быть уже удален.

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

  1. в классе Users необходимо описать конструктор;
  2. конструктор должен задавать начальные значения свойств name, login, password;
  3. создать заново три объекта, экземпляра класса Users;

Вот что должно у нас получиться:

<?php
class Users{
 public $name;
 public $login;
 public $password;
 
 //создание конструктора
 function __construct($name, $login, $password){
 $this->name = $name;
 $this->login = $login;
 $this->password = $password;
 }
 
 //создаем методод getInfo()
 function getInfo(){
 echo "<p>Name: ".$this->name."<br>";
 echo "Login: ".$this->login."<br>";
 echo "Password: ".$this->password."<br>";
 }
}

$user1 = new Users("Vasya", "vas", "123");
 //выводим метод getInfo()
 $user1->getInfo();

$user2 = new Users("Petya", "pet", "321");
 //выводим метод getInfo()
 $user2->getInfo();

$user3 = new Users("Vova", "vov", "456");
 //выводим метод getInfo()
 $user3->getInfo();
?>

Если мы с вами возьмем 4 версию PHP, то в ней такого метода, как конструктор не было. Вернее он был, но носил совершенно иное название. И название у него было одноименное с методом класса, то есть, если у меня класс называется Users, то конструктор тоже должен был называться Users (function Users(){}). А вот деструктора действительно не было вообще.

Теперь давайте поговорим вот о чем — копирование и передача объектов по ссылке, которое так или иначе всегда присутствует в ООП. В чем идея всего этого? Смотрите: $object2 = $object1. Если Вы увидите вот такую строчку, как Вы думаете, что это означает? Ну, есть варианты? Даже у меня вариантов нет. Почему? Потому что здесь все зависит от того, какую версию PHP используют — 4 или 5. Ибо в 4 версии PHP это означало копирование. То есть объект 2 — это копия объекта 1. А если мы хотели передать объект по ссылке, то мы писали вот такую вещь — $object2 = &$object1. Что же это означает — передать объект по ссылке? Я думаю, что все знают, что такое ярлык на рабочем столе в windows — это ссылка на файл. Так вот здесь тоже самое. Если более понятнее, то это два имени одного и того же объекта. Все это касается только 4 версии PHP.

А что же у нас 5 версии? А здесь у нас вот это выражение $object2 = $object1 уже будет ссылкой. Тогда возникает вопрос, а как же мне тогда скопировать объект? А копируется он с помощью волшебного слова clone: $object2 = clone $object1.

Обратите внимание, что при копировании объекта, конструктор не вызывается. Но ведь при копировании создается новый объект и у нас может возникнуть необходимость, что-то автоматически выполнить.

В этом случае мы можем описать специальный метод — двойное нижнее подчеркивание clone (__clone), который будет автоматически вызываться при копировании объектов:

<?php
class Users{
 public $name;
 public $login;
 public $password;
 
 //создание конструктора
 function __construct($name, $login, $password){
 $this->name = $name;
 $this->login = $login;
 $this->password = $password;
 }
 
 //создаем метод clone
 function __clone(){
 echo "<p>Объект скопирован!";
 }
 
 //создаем методод getInfo()
 function getInfo(){
 echo "<p>Name: ".$this->name."<br>";
 echo "Login: ".$this->login."<br>";
 echo "Password: ".$this->password."<br>";
 }
}

$user1 = new Users("Vasya", "vas", "123");
 //выводим метод getInfo()
 $user1->getInfo();

$user2 = new Users("Petya", "pet", "321");
 //выводим метод getInfo()
 $user2->getInfo();

$user3 = new Users("Vova", "vov", "456");
 //выводим метод getInfo()
 $user3->getInfo();
//объект $user4 копия объекта $user3 
$user4 = clone $user3;
?>

Теперь давайте выполним следующее задании нашей лабораторной работы:

  1. в классе Users описать метод __clone();
  2. метод __clone должен задавать начальные значения свойств по умолчанию при копировании объектов;
  3. значения по умолчанию: name = «User», login = «User», password = «qwerty»;
  4. создать четвертый объект, скопировав один из имеющихся объектов;

Вот что должно у нас получиться:

<?php
class Users{
 public $name;
 public $login;
 public $password;
 
 //создание конструктора
 function __construct($name, $login, $password){
 $this->name = $name;
 $this->login = $login;
 $this->password = $password;
 }
 
 //создаем метод clone
 function __clone(){
 $this->name = "User";
 $this->login = "User";
 $this->password = "qwerty";
 }
 
 //создаем методод getInfo()
 function getInfo(){
 echo "<p>Name: ".$this->name."<br>";
 echo "Login: ".$this->login."<br>";
 echo "Password: ".$this->password."<br>";
 }
}

$user1 = new Users("Vasya", "vas", "123");
 //выводим метод getInfo()
 $user1->getInfo();

$user2 = new Users("Petya", "pet", "321");
 //выводим метод getInfo()
 $user2->getInfo();

$user3 = new Users("Vova", "vov", "456");
 //выводим метод getInfo()
 $user3->getInfo();
//объект $user4 копия объекта $user3 
$user4 = clone $user3;
 $user4->getInfo();
?>

Итак, это была вторая часть нашей лабораторной работы. В следующей части мы продолжим изучение ООП в PHP.

Категория: Лабораторная работа ч.2 по объектно-ориентированному программированию на PHP | Добавил: Efes16rus (25.01.2015)
Просмотров: 136 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт
Поиск
Друзья сайта