Полный цикл в digital

Объекты и классы

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

Ключевыми понятиями парадигмы ООП являются понятия класс и объект. Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека - этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является объектом или экземпляром этого класса.

Для создания класса в PHP используется ключевое слово class, после которого идет название класса и фигурные скобки {} блок кода класса. Например, новый класс, представляющий пользователя:

class Person {
}

Чтобы создать объект класса Person, применяется ключевое слово new:

<?
class Person {
}
$person = new Person();
print_r($person);

В данном случае переменная $person является объектом класса Person. С помощью функции print_r() можно вывести содержимое объекта, как и в случае с массивами.

При этом неважно, определяется класс до или после создания объекта. Например, мы можем сначала определить переменную класса, а потом определить этот класс:

<?
$person = new Person();
class Person {
}

Свойства и методы

Класс может содержать переменные, которые описывают какие-то признаки объекта, его состояние и которые еще назывют свойствами или атрибутам. И также класс может содержать функции, которые еще назвают методами и которые определяют его поведение.

Так, добавим в класс Person несколько свойств и методов:

<?
class Person { 
public $name, $age;
function hello() {
echo "Hello!<br>";
}
}
$tom = new Person();
$tom->name = "Tom"; // установка свойства $name
$tom->age = 36; // установка свойства $age
$personName = $tom->name; // получение значения свойства $name
echo "Имя пользователя: " . $personName . "<br>";
$tom->hello(); // вызов метода hello()
print_r($tom);

Здесь класс Person содержит два свойства: $name и $age. Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа - в данном случае модификатор public.

Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция hello() просто выводит приветствие.

После создания объекта класса Person:

$tom = new Person();

Мы можем через имя переменной класса обращаться к его свойствам и методам. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа ->. Например, установить значения свойств:

$tom->name = "Tom"; // установка свойства $name
$tom->age = 36; // установка свойства $age

Или получить значение (например, присвоить его переменной):

$personName = $tom->name; // получение значения свойства $name

Или вызвать методы объекта:

$tom->hello(); // вызов метода hello()

В итоге мы получим следующий вывод браузера:

Имя пользователя: Tom
Hello!
Person Object ( [name] => Tom [age] => 36 )

При этом свойствам можно задать в классе некоторые начальные значения:

<?
class Person { 
public $name = "Undefined", $age = 18;
function hello() {
echo "Hello!<br>";
}
}
$tom = new Person();
$tom->age = 36; // установка свойства $age
echo "Имя пользователя: " . $tom->name . "<br>";
echo "Возраст пользователя: " . $tom->age . "<br>";

Вывод брузера:

Имя пользователя: Undefined
Возраст пользователя: 36

Ключевое слово this

Для обращения к свойствам и методам объекта внутри его класса применяется ключевое слово this. Например, определим в классе метод для вывода информации об объекте:

<?
class Person { 
public $name = "Undefined", $age = 18;
function displayInfo() {
echo "Name: " . $this->name ."; Age: " . $this->age . "<br>";
// также можно написать
// echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> displayInfo(); // Name: Tom; Age: 18

Для обращения к полям и методам внутри класса также применяется оператор доступа ->, перед которым идет $this. Причем это $this указывает именно на текущий объект. Что это значит в практическом плане:

<?
class Person { 
public $name = "Undefined", $age = 18;
function displayInfo() {
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> displayInfo();
$bob = new Person();
$bob -> name = "Bob";
$bob -> age = 25;
$bob -> displayInfo();

При вызове:

$tom -> displayInfo();

$this фактически будет указывать на переменную $tom. Тогда как при вызове:

$bob -> displayInfo();

$this будет указывать на переменную $bob. Вывод браузера:

Name: Tom; Age: 18
Name: Bob; Age: 25

Сравнение объектов

При сравнении объектов классов следует принимать во внимание ряд особенностей. В частности, при использовании оператора равенства == два объекта считаются равными, если они представляют один и тот же класс и их свойства имеют одинаковые значения.

А при использовании оператора эквивалентности === оба объекта считаются равными, если обе переменных классах указывают на один и тот же экземпляр класса. Рассмотрим на примере:

<?
class Person { 
public $name, $age;
function displayInfo() {
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> age = 36;
$tomas = new Person();
$tomas -> name = "Tom";
$tomas -> age = 36;
if($tom == $tomas) echo "переменные tom и tomas равны<br>";
else echo "переменные tom и tomas НЕ равны<br>";
if($tom === $tomas) echo "переменные tom и tomas эквивалентны";
else echo "переменные tom и tomas НЕ эквивалентны";

Здесь сравниваются две переменных - $tom и $tomas. Они представляют один и тот же класс Person, и их свойства имеют одни и те же значения. Однако они представляют разные объекты. Поэтому при сравнении оператор == возвратит true, а оператор === - false:

переменные tom и tomas равны
переменные tom и tomas НЕ эквивалентны

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

<?
$person = new Person();
$tom = $person;
$tom -> name = "Tom";
$tom -> age = 36;
$tomas = $person;
if($tom == $tomas) echo "переменные tom и tomas равны<br>";
else echo "переменные tom и tomas НЕ равны<br>";
if($tom === $tomas) echo "переменные tom и tomas эквивалентны";
else echo "переменные tom и tomas НЕ эквивалентны";

Здесь объект класса Person создается только один раз: $person = new Person();. И затем обе переменных $tom и $tomas будут указывать на этот объект. При этом не имеет значения, для какой именно переменной мы устанавливаем свойства. Так как в реальности это будет один и тот же объект. В итоге и оператор ==, и оператор === при сравнении возвратят true

переменные tom и tomas равны
переменные tom и tomas эквивалентны
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг