ООП   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 - визуальные среды

Знаете ли Вы, как разрешается парадокс Ольберса?
(Фотометрический парадокс, парадокс Ольберса - это один из парадоксов космологии, заключающийся в том, что во Вселенной, равномерно заполненной звёздами, яркость неба (в том числе ночного) должна быть примерно равна яркости солнечного диска. Это должно иметь место потому, что по любому направлению неба луч зрения рано или поздно упрется в поверхность звезды.
Иными словами парадос Ольберса заключается в том, что если Вселенная бесконечна, то черного неба мы не увидим, так как излучение дальних звезд будет суммироваться с излучением ближних, и небо должно иметь среднюю температуру фотосфер звезд. При поглощении света межзвездным веществом, оно будет разогреваться до температуры звездных фотосфер и излучать также ярко, как звезды. Однако в дело вступает явление "усталости света", открытое Эдвином Хабблом, который показал, что чем дальше от нас расположена галактика, тем больше становится красным свет ее излучения, то есть фотоны как бы "устают", отдают свою энергию межзвездной среде. На очень больших расстояниях галактики видны только в радиодиапазоне, так как их свет вовсе потерял энергию идя через бескрайние просторы Вселенной. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 20.09.2019 - 04:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
18.09.2019 - 12:08: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> ПРОБЛЕМА ИСКУССТВЕННОГО ИНТЕЛЛЕКТА - Карим_Хайдаров.
18.09.2019 - 06:01: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Л.Г. Ивашова - Карим_Хайдаров.
17.09.2019 - 05:51: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ФАЛЬСИФИКАЦИЯ ИСТОРИИ - Карим_Хайдаров.
17.09.2019 - 05:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Тиртхи - Карим_Хайдаров.
16.09.2019 - 18:21: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
16.09.2019 - 03:11: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
14.09.2019 - 18:23: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
13.09.2019 - 09:08: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
12.09.2019 - 17:47: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
08.09.2019 - 03:42: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от О.Н. Четвериковой - Карим_Хайдаров.
07.09.2019 - 07:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Декларация Академической Свободы - Карим_Хайдаров.
Bourabai Research Institution home page

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