Во-первых, оператор ==
достаточно в большинстве случаев, особенно если речь идет об объектах стоимостью. Просто не забудьте предоставить метод __toString
, если вы хотите сравнить экземпляр со скалярными значениями.
<?php
final class ValueObject {
private $value;
public function __construct($value) {
$this->value = $value;
}
public function __toString() {
return (string) $this->value;
}
}
$a = new ValueObject(0);
$b = new ValueObject(1);
var_dump(
$a == $b, // bool(false)
$a == $a, // bool(true)
$b == $b, // bool(true)
$a == '0', // bool(true)
$b == '1' // bool(true)
);
Существует один глюк с этим, вы не можете сравнить скалярного типа, кроме строки (по крайней мере, не в PHP 5 и 7), потому что он будет жаловаться, что экземпляр не может быть преобразован в желаемое значение. Следовательно, вам всегда нужно убедиться, что тип значения, с которым вы сравниваете, является строкой.
Если вы хотите больше, например, вы хотите, чтобы ввести значение ввода или обрабатывать значение float до определенной точности, вам нужен другой подход. Один из способов справиться с этим заключается в следующем.
<?php
interface Comparable {
function compareTo(Comparable $other): int;
}
function class_compare(Comparable $a, Comparable $b): int {
return $a->compareTo($b);
}
final class C implements Comparable {
private $value;
public function __construct(int $value) {
$this->value = $value;
}
public function compareTo(Comparable $other): int {
assert($this instanceof $other && $other instanceof $this);
return $this->value <=> $other->value;
}
}
$c1 = new C(0);
$c2 = new C(0);
var_dump($c1->compareTo($c2)); // int(0)
$c0 = new C(0);
$c1 = new C(1);
$c2 = new C(2);
$actual = [$c2, $c1, $c0];
usort($actual, 'class_compare');
var_dump($actual === [$c0, $c1, $c2]); // bool(true)
assert
важно, так как у нас нет дженерики в PHP. Это довольно печальное состояние вещей, и нет никакого претворенного способа реализовать это.
Что я имею в виду, это следующее.
<?php
final class SomeClass {
private $value;
public function __construct($value) {
$this->value = $value;
}
public static function compare(SomeClass $a, SomeClass $b): int {
return $a->compareTo($b);
}
public function compareTo(SomeClass $other): int {
return $this->value <=> $other->value;
}
public function isEqual($other): bool {
return $other instanceof $this && $other->value === $this->value;
}
public function isIdentical($other): bool {
return $other instanceof $this && $this instanceof $other && $other->value === $this->value;
}
}
Просто придерживаясь этих имен методов по соглашению, вы можете использовать их надлежащим образом. Можно даже выделить черты для реализации желаемого поведения по умолчанию для нескольких классов.
Вы хотите сравнить объекты, являющиеся одним и тем же экземпляром экземпляра одного объекта из одного класса? Вы проверили [руководство] (http://php.net/manual/en/language.oop5.object-comparison.php)? – dbf
Java не имеет магических методов, поэтому я не знаю, что именно вы спрашиваете. Конечно, вы можете просто добавить такие методы, как на Java. –
Вместо того, чтобы сравнивать '$ ClassA === $ ClassB', просто реализуйте equals самостоятельно, так что вы можете сделать $ ClassA-> equals ($ ClassB)'. – halfer