Middle
Bir sınıfın kamuya açık bir özelliği varsa, bu sınıfın değiştirilemez olduğu anlamına mı gelir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Hayır.
Bir sınıfta genel özellik, bu özelliğin değerinin nesne dışından değiştirilebileceği anlamına gelir. Değiştirilemez bir nesne, durumu (özelliklerinin değerleri) oluşturulduktan sonra değiştirilemeyen nesnedir. Genel bir özellik bulunması, değiştirilemezlik ilkesine aykırıdır.
Değiştirilemezliği sağlamak için, sınıf aşağıdaki koşullara uygun olmalıdır:
- Tüm özellikler
privateveyaprotectedolmalıdır. - Özelliklerin değerlerini değiştiren setter metodları olmamalıdır.
- Sınıfın bağımlılıkları (çalıştığı nesneler) da değiştirilemez olmalı veya durumu dışarıdan değişmemelidir.
- Yapıcı metod, nesneyi tamamen başlatmalı ve oluşturulduktan sonra değişmemelidir.
- Değişiklik gerekiyorsa, yeni değerlerle yeni nesneler oluşturulmalıdır.
Örnek bir genel özelliğe sahip (değiştirilebilir) sınıf:
<?php
class MutableObject
{
public $value; // Genel özellik
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Dışarıdan değer değiştirildi
echo $obj->value; // 20
Değiştirilemez bir sınıfın örneği:
<?php
class ImmutableObject
{
private $value; // Özel özellik
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// "Değişiklik" için metod, aslında yeni bir nesne oluşturur
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Hata: Özel özelliğe erişim engellenmiştir
$obj2 = $obj1->withValue(20); // Yeni nesne oluşturulur
echo $obj1->getValue(); // 10 (orijinal nesne değişmedi)
echo $obj2->getValue(); // 20 (değiştirilmiş yeni nesne)