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 + __setmagische 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 barals Privateigentum, damit PHP __set automatisch umgewandelt wird .
__setprü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 BarInstanz 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