Лабораторная работа ч.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();
?>
Запустив этот код, мы видим, что при удалении объектов, а они удаляются у нас здесь автоматически, вызывается деструктор с записью — Объект удалился. У нас было три объекта — соответственно выводятся три раза запись — «Объект удалился!».
Обратите внимание, что деструктор имеет круглые скобки, но передавать параметры в эти круглые скобки нельзя! Еще один важный момент — порядок удаления объектов не определен, никогда. То есть у нас есть три объекта и их надо удалить. Так вот в каком порядке они будут удаляться, это не определено. Поэтому есть такое правило — из деструктора не обращаться к другим объектам, так как на момент вызова объекта, он может быть уже удален.
Теперь переходим к нашей лабораторной работе и выполним следующие задания, с помощью которых мы должны сократить свой код, о чем мы говорили в первой части:
- в классе Users необходимо описать конструктор;
- конструктор должен задавать начальные значения свойств name, login, password;
- создать заново три объекта, экземпляра класса 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;
?>
Теперь давайте выполним следующее задании нашей лабораторной работы:
- в классе Users описать метод __clone();
- метод __clone должен задавать начальные значения свойств по умолчанию при копировании объектов;
- значения по умолчанию: name = «User», login = «User», password = «qwerty»;
- создать четвертый объект, скопировав один из имеющихся объектов;
Вот что должно у нас получиться:
<?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.
|