Аналогом структур из Си в PHP являются классы (как вы увидите позже, классы устроены намного сложнее). По крайней мере, в первом приближении.
<?php
// Обратите внимание на стиль, где ставятся открывающие и закрывающие скобки:
class Point
{
public $x;
public $y;
}
Определение класса подозрительно похоже на определение структуры. За ключевым словом class
следует имя класса, затем в фигурных скобках перечисляются элементы класса. Если в структурах их элементы назывались членами, то в PHP их принято называть свойствами. Такое именование характерно для большинства классовых языков. В PHP классы должны начинаться с заглавной буквы.
Одно из отличий классов от структур связано с наличием встроенного механизма защиты данных. Ключевое слово public
делает свойства публичными, то есть доступными снаружи для чтения и модификации. Это поведение аналогично тому, как ведут себя элементы структур. Кроме public
есть и другие варианты, но мы их рассмотрим позже, когда поговорим об инкапсуляции и методах.
Определив класс, можно начать создавать объекты или, как их ещё называют, экземпляры (instance) класса. На текущий момент достаточно рассматривать объект как конкретную структуру данных с конкретными данными.
<?php
// Создаём объект класса Point
$point = new Point();
// По умолчанию значения равны null
print_r($point->x); // => null
print_r($point->y); // => null
// Обратите внимание на синтаксис. Такой вызов неверный: $point->$x.
$point->x = 5;
$point->y = 10;
print_r($point->x); // => 5
print_r($point->y); // => 10
Создание объекта выглядит, как вызов функции, к которому добавили ключевое слово new
, и как вы увидите позже, это, так и есть. В остальном всё работает, как и в структурах, только для разделения используется не точка, а стрелка. При обращении к свойствам знак $
перед именем свойства не ставится.
Попробуйте создать данный класс на replit.com. Создайте несколько экземпляров, распечатайте их, измените свойства.
Если распечатать объект на экран print_r($point)
, то можно увидеть его структуру и значения всех свойств.
Point Object
(
[x] => 5
[y] => 10
)
Классы как рекурсивная структура данных
Как и в случае со структурами, значением свойства объекта может быть другой объект. Ограничений на вложенность никаких нет: объекты, содержащие объекты, которые содержат объекты — это нормально.
<?php
class Circle
{
public $center;
public $radius;
}
$circle = new Circle();
$circle->radius = 3;
$circle->center = new Point();
$circle->center->x = 5;
$circle->center->y = 10;
print_r($circle->center->x); // => 5
print_r($circle->radius); // => 3
Типы данных
В PHP около 10 встроенных типов данных, с большинством которых мы уже знакомы, например со строками или массивами. Объекты в этом списке представлены типом object
.
<?php
gettype($circle); // object
gettype($point); // object
С другой стороны, каждый класс в PHP может рассматриваться как пользовательский тип данных, а его объекты-значения (инстансы) — как данные этого типа. На синтаксическом уровне классы наравне с обычными типами могут использоваться для описания входных и выходного типов данных функций.
<?php
function showUser(User $user) {
// ...
}
Такое определение вызовет ошибку при передаче в функцию любых посторонних данных.
Вывод
Классы — основной способ описывать программные абстракции в PHP; следовательно, объекты — основной способ их использования. Знакомиться с этими понятиями непросто из-за обилия новых терминов, конструкций языка и просто того, что PHP во многих аспектах с объектами ведёт себя не так, как с другими данными. Но просто выучить эти особенности недостаточно для понимания того, что такое ООП, и как писать в этом стиле. Эту ситуацию можно сравнить с игрой в шахматы. Знание, как ходят фигуры, не делает из вас шахматиста. Обучение самой игре — процесс долгий и достаточно сложный. Большая часть этого курса посвящена изучению базовых правил, а вот практика отрабатывается дальше в курсах, посвящённых веб-разработке и ORM. Поэтому не переживайте, что даже зная, как описывать классы и создавать объекты, вы ещё некоторое время не будете понимать, как создавать полноценные программы.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.