7.4+:
Gute Nachrichten, dass es in den neuen Versionen implementiert wird, wie @Andrea betonte. Ich werde diese Lösung nur hier belassen, falls jemand sie vor 7.4 verwenden möchte
7,3 oder weniger
Aufgrund der Benachrichtigungen, die ich immer noch von diesem Thread erhalte, glaube ich, dass viele Leute da draußen das gleiche Problem hatten / haben wie ich. Meine Lösung für diesen Fall bestand darin, Setter + __set
magische Methode in einem Merkmal zu kombinieren , um dieses Verhalten zu simulieren. Hier ist es:
trait SettersTrait
{
public function __set($name, $value)
{
$setter = 'set'.$name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} else {
$this->$name = $value;
}
}
}
Und hier ist die Demonstration:
class Bar {}
class NotBar {}
class Foo
{
use SettersTrait;
private $bar;
protected function setBar(Bar $bar)
{
$this->bar = $bar;
}
}
$foo = new Foo();
$foo->bar = new NotBar();
Erläuterung
Definieren Sie zunächst bar
als Privateigentum, damit PHP __set
automatisch umgewandelt wird .
__set
prüft, ob im aktuellen Objekt ( method_exists($this, $setter)
) ein Setter deklariert ist . Andernfalls wird der Wert nur wie gewohnt eingestellt.
Deklarieren Sie eine Setter-Methode (setBar), die ein typbezogenes Argument ( setBar(Bar $bar)
) empfängt .
Solange PHP erkennt, dass etwas, das keine Bar
Instanz ist, an den Setter übergeben wird, löst es automatisch einen schwerwiegenden Fehler aus: Nicht erfasster Typ Fehler: Argument 1, das an Foo :: setBar () übergeben wird, muss eine Instanz von Bar sein, Instanz von NotBar angegeben