7.4+:
Dobra wiadomość, że zostanie zaimplementowana w nowych wydaniach, jak wskazał @Andrea. Po prostu zostawię to rozwiązanie na wypadek, gdyby ktoś chciał z niego skorzystać przed 7.4
7,3 lub mniej
Na podstawie powiadomień, które nadal otrzymuję z tego wątku, uważam, że wiele osób miało / ma ten sam problem, co ja. Moim rozwiązaniem w tym przypadku było połączenie seterów + __set
metody magicznej wewnątrz cechy w celu zasymulowania tego zachowania. Oto ona:
trait SettersTrait
{
public function __set($name, $value)
{
$setter = 'set'.$name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} else {
$this->$name = $value;
}
}
}
A oto demonstracja:
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();
Wyjaśnienie
Przede wszystkim zdefiniuj bar
jako własność prywatną, aby PHP rzutowało __set
automatycznie .
__set
sprawdzi, czy w bieżącym obiekcie ( method_exists($this, $setter)
) jest zadeklarowany setter . W przeciwnym razie ustawi swoją wartość tak, jak zwykle.
Zadeklaruj metodę ustawiającą (setBar), która odbiera argument ze wskazówką o typie ( setBar(Bar $bar)
).
Dopóki PHP wykryje, że coś, co nie jest Bar
instancją, jest przekazywane do ustawiającego, automatycznie wywoła błąd krytyczny: Uncaught TypeError: Argument 1 przekazany do Foo :: setBar () musi być instancją Bar, podana instancja NotBar