ООП   PHP   web   4GL - визуальные среды

Лабораторная работа ч.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.

Евгений Владимирович Андреев

ООП   PHP   web   4GL - визуальные среды

Знаете ли Вы, что, когда некоторые исследователи, пытающиеся примирить релятивизм и эфирную физику, говорят, например, о том, что космос состоит на 70% из "физического вакуума", а на 30% - из вещества и поля, то они впадают в фундаментальное логическое противоречие. Это противоречие заключается в следующем.

Вещество и поле не есть что-то отдельное от эфира, также как и человеческое тело не есть что-то отдельное от атомов и молекул его составляющих. Оно и есть эти атомы и молекулы, собранные в определенном порядке. Также и вещество не есть что-то отдельное от элементарных частиц, а оно состоит из них как базовой материи. Также и элементарные частицы состоят из частиц эфира как базовой материи нижнего уровня. Таким образом, всё, что есть во вселенной - это есть эфир. Эфира 100%. Из него состоят элементарные частицы, а из них всё остальное. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 02.07.2020 - 06:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
01.07.2020 - 20:08: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
01.07.2020 - 20:07: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
01.07.2020 - 20:06: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Владимира Васильевича Квачкова - Карим_Хайдаров.
01.07.2020 - 20:04: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Пламена Паскова - Карим_Хайдаров.
01.07.2020 - 05:39: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
01.07.2020 - 04:20: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
30.06.2020 - 19:53: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
29.06.2020 - 16:12: ТЕОРЕТИЗИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ - Theorizing and Mathematical Design -> ФУТУРОЛОГИЯ - прогнозы на будущее - Карим_Хайдаров.
29.06.2020 - 16:08: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от К.П. Петрова (КОБ) - Карим_Хайдаров.
29.06.2020 - 08:01: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Игоря Алексеевича Гундарова - Карим_Хайдаров.
29.06.2020 - 06:56: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ЗА НАМИ БЛЮДЯТ - Карим_Хайдаров.
Bourabai Research Institution home page

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