Что означает class в php

Классы и объекты в PHP

Класс — это шаблон для объектов, а объект — это экземпляр класса.

Что такое класс PHP?

Синтаксис

Ключевое слово class используется для определения класса в PHP. Ниже приведены правила создания класса в PHP:

Как добавить свойства к классу?

Мы вызываем свойства внутри класса. Свойства могут принимать такие значения, как строки, целые числа и логические значения (true/false), как и любые другие переменные. Добавим несколько свойств в класс Car:

Приведем правила создания свойств к классу:

Пример

Данный код ничего не выведет, поскольку мы создали класс, но не создали пока ни одного объекта.

Примечание: В классе переменные называются свойствами, а функции — методами!

Что такое объект PHP?

Объект — это экземпляр класса. Из класса мы можем создать столько объектов, сколько может понадобиться для проекта. Каждый объект имеет все свойства и методы, определенные в классе, но у них будут разные значения свойств.

Процесс создания объекта также известен как создание экземпляра.

Объекты, для чего они нужны?

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

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

Хотя все объекты были созданы из одного и того же класса и, следовательно, имеют методы и свойства класса, они все же разные. Это не только потому, что они имеют разные названия, но и потому, что их свойствам могут быть присвоены разные значения. Например, на изображении выше они различаются свойством цвета: Mercedes зеленый, Bmw синий, а Audi оранжевый.

Примечание: Класс содержит методы и свойства, общие для всех созданных из него объектов.

Хотя объекты используют один и тот же код, они могут вести себя по-разному, поскольку им могут быть присвоены разные значения.

Как получить свойства объекта?

Создав объект, мы можем получить его свойства. Например:

Пример

Результат выполнения кода:

Свойство color было установлено в классе по умолчанию (green), поэтому все объекты его унаследовали.

Как установить свойства объекту?

Чтобы установить свойство объектe, мы используем аналогичный подход.

Например, установим синий цвет объекту bmw :

Пример

Результат выполнения кода:

Как добавить методы в класс?

Классы могут содержать различные функции. Функция внутри класса называется методом. Здесь мы добавляем в класс метод hello() с префиксом public :

Правила создания методов:

Мы можем подходить к методам так же, как и к свойствам:

Пример

Пример

Результат выполнения кода:

Пример

Результат выполнения кода:

Пример

Сделать это можно двумя способами:

Пример

Результат выполнения кода:

Пример

Результат выполнения кода:

Является ли объект экземпляром класса?

Оператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса:

Пример

Результат выполнения кода:

Итоги

Источник

Классы и объекты

Первое препятствие для понимания объектно-ориентированного программирования — это странная и удивительная связь между классом и объектом. Для многих людей именно эта связь становится первым моментом откровения, первой искрой интереса к объектно-ориентированному программированию. Поэтому давайте уделим должное внимание основам.

Классы часто описывают с помощью объектов. Это очень интересно, потому что объекты часто описывают с помощью классов. Это хождение по кругу может сделать очень трудными первые шаги в объектно-ориентированном программировании. Поскольку именно классы определяют объекты, мы должны начать с определения классов.

Если говорить кратко, то — это шаблон кода, который используется для создания объектов. Класс объявляется с помощью ключевого слова class и произвольного имени класса. В именах классов может использоваться любое сочетание букв и цифр, но они не должны начинаться с цифры. Код, связанный с классом, должен быть заключен в фигурные скобки. Давайте объединим эти элементы, чтобы построить класс:

Класс ShopProduct из этого примера — уже полноправный класс, хотя пока и не слишком полезный. Но тем не менее мы сделали нечто очень важное. Мы определили тип, т.е. создали категорию данных, которые можем использовать в своих сценариях.

Если класс — это шаблон для создания объектов, следовательно, — это данные, которые структурируются в соответствии с шаблоном, определенным в классе. При этом говорят, что объект — это экземпляр класса. Его тип определяется классом. Мы будем использовать класс ShopProduct как форму для создания объектов типа ShopProduct. Для этого нам нужен оператор new. Он используется совместно с именем класса следующим образом:

После выполнения этой функции будут выведены следующие данные:

Что означает class в php. img114. Что означает class в php фото. Что означает class в php-img114. картинка Что означает class в php. картинка img114. Класс — это шаблон для объектов, а объект — это экземпляр класса.Дамп двух объектов

Передав наши объекты функции var_dump(), мы можем узнать о них полезную информацию, включая внутренний идентификатор каждого объекта, указанный после символа ‘#’. Чтобы сделать эти объекты более интересными, мы должны немного изменить определение класса ShopProduct, добавив в него специальные поля данных, называемые свойствами (properties).

Определение свойств в классе

В классах можно определять специальные переменные, которые называются свойствами. Свойство, которое называется также переменной-членом (member variable), содержит данные, которые могут меняться от одного объекта к другому. В случае объектов ShopProduct нам нужно иметь возможность менять, например, поля названия товара и его цены.

Определение свойства в классе похоже на определение обычной переменной, за исключением того, что перед операторами объявления или присвоения нужно поместить одно из ключевых слов, характеризующих область его видимости: public, protected или private.

Область видимости (scope) определяет контекст функции или класса, в котором можно пользоваться данной переменной (или методом, о чем мы поговорим в следующей статье). Так переменная, определенная внутри тела функции, имеет локальную область видимости, а переменная, определенная за пределами функции — глобальную область видимости. Как правило, нельзя получить доступ к данным, находящимся в локализованных областях видимости по отношению к текущей области. Поэтому если вы определяете переменную внутри функции, то впоследствии не сможете получить к ней доступ извне этой функции. Объекты в этом смысле более «проницаемы», и к некоторым объектным переменным можно иногда получать доступ из другого контекста. К каким переменным можно получать доступ и из какого контекста, и определяют ключевые слова public, protected или private.

К этим ключевым словам и вопросу видимости мы вернемся в следующей статье. А сейчас давайте определим некоторые свойства с помощью ключевого слова public:

Как видите, мы определили четыре свойства, присвоив каждому из них стандартное значение. Теперь любым объектам, экземпляры которых мы будем создавать с помощью класса ShopProduct, будут присвоены стандартные данные. А ключевое слово public, присутствующее в объявлении каждого свойства, обеспечит доступ к этому свойству извне контекста объекта.

Ключевые слова public, protected и private, определяющие область видимости свойств, появились в PHP 5. В версии PHP 4 приведенный выше пример работать не будет. В PHP 4 все свойства должны быть объявлены с помощью ключевого слова var, что, по сути, идентично использованию ключевого слова public. Исходя из принципа обратной совместимости, в PHP 5 допускается использование для свойств ключевого слова var вместо public.

К переменным свойств можно обращаться с помощью символов ‘->’, указав имя объектной переменной и имя свойства. Поскольку свойства объектов были определены как public, мы можем считывать их значения, а также присваивать им новые значения, заменяя тем самым набор стандартных значений, определенный в классе:

На самом деле в PHP необязательно объявлять все свойства в классе. Свойства можно динамически добавлять к объекту следующим образом:

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

Здесь мы снова используем класс ShopProduct, переопределяя один за другим все стандартные значения его свойств, пока не определим всю информацию о товаре. А теперь, когда мы определили некоторые данные, можно к ним обратиться:

В результате на выходе получим следующее:

Что означает class в php. img115. Что означает class в php фото. Что означает class в php-img115. картинка Что означает class в php. картинка img115. Класс — это шаблон для объектов, а объект — это экземпляр класса.Вывод значений нескольких свойств объекта

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

С точки зрения интерпретатора PHP, этот код абсолютно корректен, поэтому никакого предупреждения об ошибке мы не получим. Но когда понадобится вывести имя автора, мы получим неожиданные результаты. Еще одна проблема — наши объекты, в целом, слишком «нестрогие». Мы не обязаны определять название книги, цену или имя автора. Клиентский код может быть уверен, что эти свойства существуют, но, вполне вероятно, очень часто их стандартные значения не будут вас устраивать. В идеале, следовало бы заставлять всякого, кто создает экземпляры объекта ShopProduct, определять осмысленные значения его свойств.

И наконец, мы должны потратить уйму сил, чтобы сделать то, что, вероятно, придется делать очень часто. Вывести полное имя автора — это довольно трудоемкий и нудный процесс. И было бы прекрасно, если бы объект делал это за нас. Все эти проблемы можно решить, если снабдить объект ShopProduct собственным набором функций, которые можно использовать для выполнения операций над данными внутри контекста объекта.

Методы

Так же как свойства позволяют объектам сохранять данные, методы позволяют объектам выполнять задачи. — это специальные функции, которые объявляются внутри класса. Как и можно было ожидать, объявление метода напоминает объявление функции. За ключевым словом function следует имя метода, а за ним — необязательный список переменных-аргументов в круглых скобках. Тело метода заключается в фигурные скобки:

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

В большинстве случаев метод вызывают с помощью объектной переменной, за которой указываются символы ‘->’ и имя метода. При вызове метода нужно использовать круглые скобки, так же как при вызове функции (даже если методу не передаются никакие аргументы). Давайте добавим методы к определенному ранее классу ShopProduct:

В результате на выходе получим результат аналогичный предыдущему.

Мы добавили метод getProducer() к классу ShopProduct. Обратите внимание на то, что при определении метода мы не включили ключевое слово, определяющее его видимость. Это означает, что метод getProducer() относится к типу public и его можно вызвать из-за пределов класса.

Итак, нам удалось немного улучшить наш класс. Но для него по-прежнему характерна слишком большая «гибкость». Мы полагаемся на то, что программист будет изменять стандартные значения свойств объекта ShopProduct. Но это проблематично в двух отношениях. Во-первых, нужно пять строк кода, чтобы должным образом инициализировать объект типа ShopProduct, и ни один программист вам не скажет за это спасибо. Во-вторых, у нас нет способа гарантировать, что какое-либо свойство будет определено при инициализации объекта ShopProduct. Поэтому нам нужен метод, который будет вызываться, автоматически при создании экземпляра объекта на основе класса.

Конструктор класса

Метод конструктора вызывается при создании объекта. Его можно использовать, чтобы все настроить, обеспечить определение необходимых свойств и выполнить всю необходимую предварительную работу. До PHP 5 имя метода конструктора совпадало с именем класса, к которому оно относилось. Так, класс ShopProduct мог использовать метод ShopProduct() в качестве своего конструктора. В PHP 5 вы должны назвать метод конструктора __construct(). Обратите внимание на то, что имя метода начинается с двух символов подчеркивания. Это правило наименования действует для многих других специальных методов в PHP-классах. Давайте определим конструктор для класса ShopProduct:

В PHP 4 не распознается метод __construct в качестве конструктора. Если вы используете PHP 4, то для создания конструктора объявите метод, имя которого совпадает с именем содержащего его класса. Поэтому для класса с именем ShopProduct можно объявить конструктор с помощью метода под названием ShopProduct(). В PHP по-прежнему поддерживается эта схема именования конструктора. Но если вам не нужна совместимость со старыми версиями PHP то методы конструктора лучше называть __construct.

Теперь стало безопаснее использовать объект ShopProduct и легче создавать экземпляры на основе его класса. Создание экземпляров и определение значений свойств выполняются в одном операторе. При написании любого кода, в котором используется объект ShopProduct, можно быть уверенным, что все свойства этого объекта будут инициализированы.

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

Аргументы и типы

Типы определяют, каким способом можно оперировать данными в сценариях. Например, строковый тип используется для отображения символьных данных и для выполнения операций над такими данными с помощью строковых функций. Целые числа используются в математических выражениях, булевы числа — в логических выражениях и т.д. Эти категории называются элементарными типами данных. Класс также определяет тип имени себя, но на более высоком уровне. Поэтому объект ShopProduct относится к элементарному типу object, а также к типу класса ShopProduct. Более подробно о типах читайте в статье «Типы данных».

При определении метода и функции не требуется, чтобы аргумент был определенного типа. Но это одновременно и преимущество, и недостаток. То, что аргумент может быть любого типа, дает широкое поле действий. Благодаря этому можно создавать методы, которые будут гибко обрабатывать данные различных типов и приспосабливать свою функциональность к меняющимся обстоятельствам. Но эта гибкость, с другой стороны, может стать причиной неопределенности в коде, когда тело метода ожидает один тип аргумента, а получает другой.

Мы уже говорили, что переменная-аргумент может содержать любой элементарный тип данных, однако по умолчанию ее тип не оговаривается, поэтому она может содержать объект любого типа. Такая гибкость, с одной стороны, полезна, но, с другой, может стать причиной проблем при определении метода. Рассмотрим метод, предназначенный для работы с объектом типа ShopProduct:

Мы можем протестировать этот класс следующим образом:

Тогда на выходе получим следующее:

Что означает class в php. img116. Что означает class в php фото. Что означает class в php-img116. картинка Что означает class в php. картинка img116. Класс — это шаблон для объектов, а объект — это экземпляр класса.Вызов метода вспомогательного объекта

Возможно, вас заинтересует, почему мы не добавили метод write() непосредственно в класс ShopProduct. Ответом на поставленный вопрос будет следующее: все дело в ответственности. Класс ShopProduct ответственен за хранение данных о товаре, а класс ShopProductWriter — за вывод этих данных. Позже вы начнете понимать, в чем польза такого разделения ответственности.

Для решения описанной проблемы в PHP 5 появилась новая возможность — уточнение типов данных класса. Чтобы добавить уточнение типа к аргументу метода, просто поместите перед ним имя класса. Поэтому метод write() можно изменить следующим образом:

Теперь нам не нужно каждый раз при вызове метода проверять тип передаваемого ему аргумента. Кроме того, использование уточнений делает запись метода намного понятнее для программиста клиентского кода. Он сразу же увидит требования метода write(). Программисту не нужно будет волноваться по поводу незаметных ошибок, возникающих в результате несоответствия типов аргументов, поскольку благодаря уточнению они определяются принудительно и строго.

Хотя автоматическая проверка типов — это превосходный способ предотвращения ошибок, важно понимать, что уточнения проверяются во время выполнения программы. Это означает, что уточнение класса сообщит об ошибке только тогда, когда нежелательный объект будет передан методу. И если вызов метода write() находится где-то глубоко в условном операторе, который запускается только на Новый год, то, если вы тщательно не проверили код, вам придется работать все праздники.

Уточнения нельзя использовать для принудительного определения аргументов элементарных типов, таких как строки и целые значения. Для этой цели в теле методов следует использовать функции проверки типов, такие как is_int(). Но можно принудительно определить, что аргумент является массивом:

Поддержка уточнения для массивов была добавлена в PHP начиная с версии 5.1. В дальнейшем также была добавлена поддержка нулевых стандартных значений в аргументах с уточнениями. Это означает, что можно требовать, чтобы аргумент был либо определенного типа, либо нулевым значением. Вот как это сделать:

До сих пор мы обсуждали типы и классы так, как будто это синонимы. Но между ними есть коренное различие. При определении класса вы определяете также и тип, но тип может описывать целое семейство классов. Механизм, посредством которого различные классы можно группировать под одним типом, называется наследованием. О наследовании мы и поговорим в следующей статье.

Источник

Объектно-ориентированное программирование

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рассмотрим на примере:

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

Источник

Объектно-ориентированный PHP с классами и объектами

Russian (Pусский) translation by Pembelight (you can also view the original English article)

В этой статье мы исследуем основы объектно-ориентированного программирования на PHP. Начнем с введения в классы и объекты, а во второй половине статьи обсудим несколько продвинутых понятий, таких как наследование и полиморфизм.

Что такое объектно-ориентированное программирование (ООП)?

Что такое класс PHP?

Свойства класса в PHP

Конструкторы для классов PHP

Методы для классов PHP

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

Что такое объект в PHP?

Следующее изображение является графическим представлением класса Employee и некоторых его экземпляров.

Что означает class в php. object instantiation. Что означает class в php фото. Что означает class в php-object instantiation. картинка Что означает class в php. картинка object instantiation. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. object instantiation. Что означает class в php фото. Что означает class в php-object instantiation. картинка Что означает class в php. картинка object instantiation. Класс — это шаблон для объектов, а объект — это экземпляр класса. Что означает class в php. object instantiation. Что означает class в php фото. Что означает class в php-object instantiation. картинка Что означает class в php. картинка object instantiation. Класс — это шаблон для объектов, а объект — это экземпляр класса.

Инкапсуляция

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

Уровни доступа

Доступ public

Когда вы объявляете свойство или метод как public, к нему можно получить доступ из любого места вне класса. Значение открытого свойства можно изменить из любого участка вашего кода.

Давайте рассмотрим на пример, чтобы понять как создать уровень публичного доступа.

Доступ private

Опять же, давайте пересмотрим предыдущий пример, чтобы понять уровень частного доступа.

Могут возникать веские причины, из-за которых вы захотите установить private свойство. Например, возможно, для предпринятия какого-то действия (скажем, обновить базу данных или перерисовать шаблон), если это свойство меняется. В этом случае вы можете определить метод установки и управление любой специальной логикой для изменения свойства.

Доступ protected

Наследование

Наследование является важным аспектом парадигмы объектно-ориентированного программирования, которая позволяет наследовать свойства и методы других классов, расширяя их. Класс, который наследуется, называется родительским классом, а класс, который наследует другой класс, называется дочерним классом. Когда вы создаете экземпляр объекта дочернего класса, он также наследует свойства и методы родительского класса.

Давайте посмотрим на следующий скриншот, чтобы понять концепцию наследования.

Что означает class в php. inheritence. Что означает class в php фото. Что означает class в php-inheritence. картинка Что означает class в php. картинка inheritence. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. inheritence. Что означает class в php фото. Что означает class в php-inheritence. картинка Что означает class в php. картинка inheritence. Класс — это шаблон для объектов, а объект — это экземпляр класса. Что означает class в php. inheritence. Что означает class в php фото. Что означает class в php-inheritence. картинка Что означает class в php. картинка inheritence. Класс — это шаблон для объектов, а объект — это экземпляр класса.

Давайте попробуем разобраться на реальном примере, чтобы понять, как это работает.

И так, это было краткое введение в наследование. Оно помогает сократить дублирование кода и, следовательно, способствует его повторному использованию.

Полиморфизм

Например, в контексте наследования, если дочерний класс хочет изменить поведение метода родительского класса, он может переопределить этот метод. Это называется переопределением метода. Давайте быстро рассмотрим реальный пример, чтобы понять концепцию переопределения метода.

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

Итоги

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

Что означает class в php. CRS 104433. Что означает class в php фото. Что означает class в php-CRS 104433. картинка Что означает class в php. картинка CRS 104433. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. CRS 104433. Что означает class в php фото. Что означает class в php-CRS 104433. картинка Что означает class в php. картинка CRS 104433. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. CRS 104433. Что означает class в php фото. Что означает class в php-CRS 104433. картинка Что означает class в php. картинка CRS 104433. Класс — это шаблон для объектов, а объект — это экземпляр класса.

Что означает class в php. CRS 97507. Что означает class в php фото. Что означает class в php-CRS 97507. картинка Что означает class в php. картинка CRS 97507. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. CRS 97507. Что означает class в php фото. Что означает class в php-CRS 97507. картинка Что означает class в php. картинка CRS 97507. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. CRS 97507. Что означает class в php фото. Что означает class в php-CRS 97507. картинка Что означает class в php. картинка CRS 97507. Класс — это шаблон для объектов, а объект — это экземпляр класса.

Что означает class в php. php400. Что означает class в php фото. Что означает class в php-php400. картинка Что означает class в php. картинка php400. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. php400. Что означает class в php фото. Что означает class в php-php400. картинка Что означает class в php. картинка php400. Класс — это шаблон для объектов, а объект — это экземпляр класса.Что означает class в php. php400. Что означает class в php фото. Что означает class в php-php400. картинка Что означает class в php. картинка php400. Класс — это шаблон для объектов, а объект — это экземпляр класса.

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

Не стесняйтесь размещать свои просьбы в комментариях ниже!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *