ilhan_ersoy Model::__get() magic yöntemi ile Model::$attributes özelliğinden çekiyor. Aynısı olmasa da benzer örnek olarak:
class Model
{
protected array $attributes = [
'id' => 1,
'name' => 'İlhan',
];
public function __get($key)
{
return $this->attributes[$key];
}
}
$model = new Model();
echo $model->name; // İlhan
İkinci sorunun cevabı ise, öyle olabilmesi için alanların dinamik olarak objeye eklenmesi lazım, bu sefer objelerin değişimini tutamazsınız, aynı isimde özellikler ezilir ve/veya aynı isimde olup olamayacağını kontrol edemezsiniz. Mesela original dizisi kayıt güncellenirken orjinal alanları kullanıyor böylece $model->isDirty('name') gibi bu alan güncelleniyor mu güncellenmiyor mu şeklinde karşılaştırma işlemleri yapabiliyorsunuz.
use App\Models\User;
$user = User::create([
'first_name' => 'Taylor',
'last_name' => 'Otwell',
'title' => 'Developer',
]);
$user->title = 'Painter';
$user->isDirty(); // true
$user->isDirty('title'); // true
$user->isDirty('first_name'); // false
$user->isClean(); // false
$user->isClean('title'); // false
$user->isClean('first_name'); // true
$user->save();
$user->isDirty(); // false
$user->isClean(); // true
Bu işlemlerin hepsi üstteki mantık sayesinde yapılabiliyor.