PHP   алгоритмизация   СУБД   WEB   БДИ   ЯиМП   3GL   4GL   5GL   ММТ   ТПОИ   ТП

Лабораторная работа по ООП в PHP часть 2

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

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

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

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

1<?php
2class Users{
3    public $name;
4    public $login;
5    public $password;
6     
7    //создание конструктора
8    function __construct($number){
9        echo "<p>Конструктор вызвался автоматически $number!";
10    }
11     
12    //создаем деструктор
13    function __destruct(){
14        echo "<p>Объект удалился!";
15    }
16     
17    //создаем методод getInfo()
18    function getInfo(){
19        echo "<p>Name: ".$this->name."<br>";
20        echo "Login: ".$this->login."<br>";
21        echo "Password: ".$this->password."<br>";
22    }
23}
24 
25$user1 = new Users(1);
26    $user1->name = "Vasya";
27    $user1->login = "vas";
28    $user1->password = 123;
29    //выводим метод getInfo()
30    $user1->getInfo();
31 
32$user2 = new Users(2);
33    $user2->name = "Petya";
34    $user2->login = "pet";
35    $user2->password = 321;
36    //выводим метод getInfo()
37    $user2->getInfo();
38 
39$user3 = new Users(3);
40    $user3->name = "Vova";
41    $user3->login = "vov";
42    $user3->password = 456;
43    //выводим метод getInfo()
44    $user3->getInfo();
45?>

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

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

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

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

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

1<?php
2class Users{
3    public $name;
4    public $login;
5    public $password;
6     
7    //создание конструктора
8    function __construct($name, $login, $password){
9        $this->name = $name;
10        $this->login = $login;
11        $this->password = $password;
12    }
13     
14    //создаем методод getInfo()
15    function getInfo(){
16        echo "<p>Name: ".$this->name."<br>";
17        echo "Login: ".$this->login."<br>";
18        echo "Password: ".$this->password."<br>";
19    }
20}
21 
22$user1 = new Users("Vasya", "vas", "123");
23    //выводим метод getInfo()
24    $user1->getInfo();
25 
26$user2 = new Users("Petya", "pet", "321");
27    //выводим метод getInfo()
28    $user2->getInfo();
29 
30$user3 = new Users("Vova", "vov", "456");
31    //выводим метод getInfo()
32    $user3->getInfo();
33?>

Если мы с вами возьмем 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), который будет автоматически вызываться при копировании объектов:

1<?php
2class Users{
3    public $name;
4    public $login;
5    public $password;
6     
7    //создание конструктора
8    function __construct($name, $login, $password){
9        $this->name = $name;
10        $this->login = $login;
11        $this->password = $password;
12    }
13     
14    //создаем метод clone
15    function __clone(){
16        echo "<p>Объект скопирован!";
17    }
18     
19    //создаем методод getInfo()
20    function getInfo(){
21        echo "<p>Name: ".$this->name."<br>";
22        echo "Login: ".$this->login."<br>";
23        echo "Password: ".$this->password."<br>";
24    }
25}
26 
27$user1 = new Users("Vasya", "vas", "123");
28    //выводим метод getInfo()
29    $user1->getInfo();
30 
31$user2 = new Users("Petya", "pet", "321");
32    //выводим метод getInfo()
33    $user2->getInfo();
34 
35$user3 = new Users("Vova", "vov", "456");
36    //выводим метод getInfo()
37    $user3->getInfo();
38//объект $user4 копия объекта $user3
39$user4 = clone $user3;
40?>

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

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

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

1<?php
2class Users{
3    public $name;
4    public $login;
5    public $password;
6     
7    //создание конструктора
8    function __construct($name, $login, $password){
9        $this->name = $name;
10        $this->login = $login;
11        $this->password = $password;
12    }
13     
14    //создаем метод clone
15    function __clone(){
16        $this->name = "User";
17        $this->login = "User";
18        $this->password = "qwerty";
19    }
20     
21    //создаем методод getInfo()
22    function getInfo(){
23        echo "<p>Name: ".$this->name."<br>";
24        echo "Login: ".$this->login."<br>";
25        echo "Password: ".$this->password."<br>";
26    }
27}
28 
29$user1 = new Users("Vasya", "vas", "123");
30    //выводим метод getInfo()
31    $user1->getInfo();
32 
33$user2 = new Users("Petya", "pet", "321");
34    //выводим метод getInfo()
35    $user2->getInfo();
36 
37$user3 = new Users("Vova", "vov", "456");
38    //выводим метод getInfo()
39    $user3->getInfo();
40//объект $user4 копия объекта $user3
41$user4 = clone $user3;
42    $user4->getInfo();
43?>
PHP   алгоритмизация   СУБД   WEB   БДИ   ЯиМП   3GL   4GL   5GL   ММТ   ТПОИ   ТП   w  

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

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 18.11.2019 - 19:10: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
16.11.2019 - 16:57: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
16.11.2019 - 16:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Марины Мелиховой - Карим_Хайдаров.
16.11.2019 - 12:16: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Игоря Кулькова - Карим_Хайдаров.
16.11.2019 - 07:23: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
15.11.2019 - 06:45: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
14.11.2019 - 12:35: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Светланы Вислобоковой - Карим_Хайдаров.
13.11.2019 - 19:20: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
12.11.2019 - 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Бориса Сергеевича Миронова - Карим_Хайдаров.
12.11.2019 - 11:49: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Веры Лесиной - Карим_Хайдаров.
10.11.2019 - 23:14: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Кирилла Мямлина - Карим_Хайдаров.
05.11.2019 - 21:56: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Декларация Академической Свободы - Карим_Хайдаров.
Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution