Сравнение объектов в PHP. Какие существуют дополнительные инструменты?

сравнение объектов в php. какие существуют дополнительные инструменты?

Использование операторов сравнения

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

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

Сравнение объектов с помощью тождественного оператора «===» имеет более строгие ограничения, но легче поддается объяснению. Две переменные, содержащие ссылки, равны между собой только когда они ссылаются на один и тот же объект.

Важно
Будьте внимательны при использовании обычного оператора равенства «==». Он применяется и при сравнении свойств объектов. Проблема в неявном преобразовании типов. Например, если свойство одного объекта содержит логическое значение false, а в другом объекте оно равно числу 0, то оба этих свойства будут равны.

//Определяем класс "Кошка"
class Cat
{
    //Свойство имени кошки
    public $nickname;
}


//Создаем объекты, назначаем разные свойства и сравниваем между собой
$firstCat = new Cat();
$firstCat->nickname = 'Снежок';

$secondCat = new Cat();
$secondCat->nickname = 'Уголек';
var_dump($firstCat == $secondCat); //Результат: bool(false)


//Устанавливаем одинаковые свойства и повторяем обычное сравнение
$firstCat->nickname = 'Мурзик';
$secondCat->nickname = 'Мурзик';
var_dump($firstCat == $secondCat); //Результат: bool(true)


//Обычное сравнение производит неявное преобразование типов свойств
$firstCat->nickname = false;
$secondCat->nickname = 0;
var_dump($firstCat == $secondCat); //Результат: bool(true)


//Производим тождественное сравнение разных объектов
var_dump($firstCat === $secondCat); //Результат: bool(false)


//Производим тождественное сравнение одного объекта
$secondCat = $firstCat;
var_dump($firstCat === $secondCat); //Результат: bool(true)

Как узнать имя класса по объекту

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

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

//Определяем класс "Удаленный сервер"
class RemoteServer {}


//Создаем объект и получаем имя класса
$server = new RemoteServer();
echo get_class($server); //Результат: RemoteServer

Проверка на принадлежность классу

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

В PHP есть специальный оператор instanceof. Слева от него должна располагаться переменная, содержащая ссылку на объект, а справа указываться имя класса, который нужно найти в цепочке наследований. Если объект принадлежит указанному классу или наследует его, то результатом операции будет true, иначе instanceof вернет false.

//Определяем общий класс "Оружие"
class Weapon {}


//Определяем дочерний класс "Пушка"
class Cannon extends Weapon {}


//Создаем объект и проверяем его
$canon = new Cannon();
var_dump($canon instanceof Weapon); //Результат: bool(true)
var_dump($canon instanceof Cannon); //Результат: bool(true)

Также вы можете использовать функцию is_subclass_of(). Она принимает два параметра. Первый может быть как строкой, так и объектом. Он определяет имя класса или объект, над которым будут проводиться проверки. Второй параметр должен быть именем класса, который будет искаться в цепочке наследований.

Как и в случае с instanceof функция is_subclass_of() возвращает логическое значение. Если объект или класс, чье имя указано в первом параметре, наследует класс, указанный во втором параметре, то функция вернет true.

//Определяем общий класс "Оружие"
class Weapon {}


//Определяем дочерний класс "Пушка"
class Cannon extends Weapon {}


//Создаем объект и проверяем его
$canon = new Cannon();
var_dump(is_subclass_of($canon, 'Cannon')); //Результат: bool(false)
var_dump(is_subclass_of($canon, 'Weapon')); //Результат: bool(true)
var_dump(is_subclass_of($canon, 'WrongClass')); //Результат: bool(false)

Последние публикации