Полный цикл в 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();
// установка свойства $name
$tom->name = "Tom"; 
// установка свойства $age
$tom->age = 36;
// получение значения свойства $name 
$personName = $tom->name; 
echo "Имя пользователя: " . $personName . "<br>";
// вызов метода hello()
$tom->hello(); 
print_r($tom);

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

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

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

$tom = new Person();

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

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

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

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

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

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

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

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

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

<?
class Person
{
    public $name = "Undefined", $age = 18;
    function hello()
    {
        echo "Hello!<br>";
    }
}
$tom = new Person();
// установка свойства $age
$tom->age = 36; 
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";
// Name: Tom; Age: 18
$tom->displayInfo(); 

Для обращения к полям и методам внутри класса также применяется оператор доступа ->, перед которым идет $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.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг