Возможно ли иметь расширенное сравнение python в php?

#php #python #comparison #comparable

#php #python #сравнение #сопоставимый

Вопрос:

Одна из моих мечтаний — использовать расширенное сравнение python (что-то вроде __eq__ ) для объектов php.

 class A {
  public $a = 1;

  public function __eq__($other) {
      return $this->a == $other->a;
  }

}


class B {
  public $a = 2;

  public function __eq__($other) {
      return $this->a == $other->a;
  }

}


class C {
  public $a = 1;

  public function __eq__($other) {
      return $this->a == $other->a;
  }

}

$a = new A();
$b = new B();
$c = new C();

echo $a == $b; //false
echo $a == $c; //true 
  

Я хотел бы иметь какой-нибудь умный механизм для быстрого сравнения моделей (объектов) по идентификатору базы данных, например.

Возможно ли это каким-либо образом в PHP?

Комментарии:

1. К сожалению, нет. Объектная модель PHP очень рудиментарна.

2. не имеет большого значения делать что-то вроде if (object1.isEquals(object2))

Ответ №1:

Нет, это не так. Распространенный способ добиться этого — использовать equals() метод, но никакого волшебного метода не существует. Вам придется вызвать это вручную. Например:

 <?php
class User
{
    private $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function equals(User $user)
    {
        return $this->getId() === $user->getId();
    }
}

$user1 = new User(1);
$user2 = new User(2);

var_dump($user1->equals($user2)); // bool(false)
var_dump($user2->equals($user1)); // bool(false)
?>
  

Который, я думаю, не сильно отличается от:

 var_dump($user1 == $user2);
var_dump($user2 == $user1);
  

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