Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Указатели PHP: Введение в ООП

Мы привыкли к тому, что данные в PHP всегда передаются по значению. Так происходит и при присваивании, и при передаче данных в функции.

<?php

$a = 5;
$b = $a;

$a = 4;
print_r($b); // => 5

Это правило применимо ко всем данным без исключения. Если мы хотим сделать передачу по ссылке, то нужно использовать &.

<?php

$a = 5;
// Теперь $a и $b ссылаются на одни и те же данные
$b = &$a;

$a = 4;
print_r($b); // => 4

Но объекты ведут себя подобно передаче по ссылке даже без &.

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

<?php

$p1 = new Point();
$p1->x = 3;
$p1->y = 5;
// p1 и p2 содержат указатель на один и тот же объект
$p2 = $p1;

$p2->x = 100;
print_r($p1->x); // => 100

Когда создаётся объект, в переменную записывается не он сам, а указатель (pointer) на него. Указатель можно воспринимать как идентификатор (номер) объекта, находящегося где-то в памяти. Когда мы присваиваем переменной объект $p2 = $p1, то происходит копирование этого идентификатора, но сам он не меняется. Другими словами, идентификатор всегда указывает на тот же самый объект. Поэтому создаётся впечатление, что объекты передаются по ссылке как при присваивании, так и при передаче объектов в функции.

<?php

function setX(Point $point, int $x)
{
    // point указывает на переданный объект, это не копия
    // изменение меняет сам объект
    $point->x = $x;
}

$point = new Point();
$point->x = 3;
$point->y = 4;
setX($point, 8);
print_r($point->x); // => 8

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


Дополнительные материалы

  1. Объекты и ссылки

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
29 сентября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»