7.4+:
Kabar baik bahwa ini akan diterapkan dalam rilis baru, seperti yang ditunjukkan oleh @Andrea. Saya hanya akan meninggalkan solusi ini di sini jika seseorang ingin menggunakannya sebelum 7.4
7,3 atau kurang
Berdasarkan notifikasi yang masih saya terima dari thread ini, saya yakin banyak orang di luar sana yang mengalami/sedang mengalami masalah yang sama seperti yang saya alami. Solusi saya untuk kasus ini adalah menggabungkan metode ajaib setter + __set
di dalam suatu sifat untuk mensimulasikan perilaku ini. Ini dia:
trait SettersTrait
{
/**
* @param $name
* @param $value
*/
public function __set($name, $value)
{
$setter = 'set'.$name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} else {
$this->$name = $value;
}
}
}
Dan inilah demonstrasinya:
class Bar {}
class NotBar {}
class Foo
{
use SettersTrait; //It could be implemented within this class but I used it as a trait for more flexibility
/**
*
* @var Bar
*/
private $bar;
/**
* @param Bar $bar
*/
protected function setBar(Bar $bar)
{
//(optional) Protected so it wont be called directly by external 'entities'
$this->bar = $bar;
}
}
$foo = new Foo();
$foo->bar = new NotBar(); //Error
//$foo->bar = new Bar(); //Success
Penjelasan
Pertama-tama, tentukan bar
sebagai properti pribadi sehingga PHP akan menampilkan __set
secara otomatis.
__set
akan memeriksa apakah ada penyetel yang dideklarasikan di objek saat ini (method_exists($this, $setter)
). Jika tidak, ia hanya akan menetapkan nilainya seperti biasanya.
Deklarasikan metode penyetel (setBar) yang menerima argumen petunjuk tipe (setBar(Bar $bar)
).
Selama PHP mendeteksi bahwa sesuatu yang bukan instance Bar
diteruskan ke penyetel, maka secara otomatis akan memicu Kesalahan Fatal: Uncaught TypeError: Argument 1 yang diteruskan ke Foo::setBar() harus berupa instance Bar, contoh NotBar diberikan
person
CarlosCarucce
schedule
19.06.2018