Prima di tutto l'operatore ==
è sufficiente nella maggior parte dei casi, soprattutto se stiamo parlando di oggetti di valore. Assicurati di fornire un metodo __toString
se desideri la possibilità di confrontare l'istanza con valori scalari.
<?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)
);
C'è una Gotcha con questo, non è possibile confrontare di tipo scalare diverso stringa (almeno non in PHP 5 e 7) perché si lamentano che l'istanza non può essere convertito nel valore desiderato. Quindi, è sempre necessario assicurarsi che il tipo di valore che si confronta sia una stringa.
Se si desidera altro, ad es. vuoi mettere in minuscolo l'input o gestire il valore float fino a una certa precisione, hai bisogno di un approccio diverso. Un modo per gestire questo è il seguente.
<?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)
Il assert
è importante dal momento che non abbiamo generici in PHP. Questo è uno stato di cose piuttosto triste e non c'è un modo carino per implementarlo.
Quello che tendo a fare è il seguente.
<?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;
}
}
Basta aderire a questi nomi di metodo per convenzione che consente di utilizzarli in modo appropriato. Si potrebbero anche fornire tratti per implementare il comportamento predefinito desiderato tra più classi.
Desiderate confrontare gli oggetti che sono la stessa istanza o due istanze di oggetti della stessa classe? Hai controllato [il manuale] (http://php.net/manual/en/language.oop5.object-comparison.php)? – dbf
Java non ha metodi magici, quindi non so esattamente cosa stai chiedendo. Certo, puoi semplicemente aggiungere metodi come puoi in Java. –
Invece di confrontare '$ ClassA === $ ClassB', implementa solo te stesso, quindi puoi fare' $ ClassA-> equals ($ ClassB) '. – halfer