Nesne Görünürlüğü
"Devtools projesi ile framework kullanma deneyiminizi daha görsel hale getirebilirsiniz."
Görünürlük kavramı Nesne Yönelimli Programlama'da sınıf nesnelerine (nitelikler, yöntemler) dışarıdan erişim sağlanıp sağlanamayacağı ile ilgili bir kavramdır. Bir önceki konumuzda oluşturduğumuz örnek sınıfımızda yer alan nitelik yöntemlere sınıf dışarısından erişim sağlayabilmiştik. Nesnelerin görünürlüklerini neden değiştirmeye ihtiyacımız var sorusu aklınıza gelebilir. Sınıf tasarımları gerçekleştirirken bazı yöntemlerin sadece sınıf içerisinde kullanması gerekir. Çünkü bu yöntemler sınıfın yapısı ile ilgili kodları barındırır. Böyle bir kod grubunun yer aldığı yöntemlere dışarıdan müdahale edilmesini istemeyiz. Dolayısı ile sınıf içi niteliklerin ve yöntemlerin görünürlükleri sınıf tasarımına göre değiştirilmesi gerekebilir.
Genel programlama dillerinde kullanılan 3 görünüm belirteci vardır;
Bu görünüm deyimine sahip yöntem ve niteliklere sınıf dışından erişilebilir. |
|
Bu görünüm deyimine sahip yöntem ve niteliklere alt (child) ve üst (parent) sınıflardan erişilebilir. |
|
Bu görünüm deyimine sahip yöntem ve niteliklere sadece aynı sınıf içinde erişilebilir. |
# Public
Bu görünüme sahip nesnelere sınıf dışından erişilebilir. En kapsamlı görünüm deyimidir.
class Car
{
public $name;
public function setName(string $name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
}
Yukarıdaki gibi örnek bir sınıfa sahip olduğumuzu varsayalım. Bu sınıfın tüm nitelik ve yöntemleri public görünürlüğü ile belirtildiği için sınıf kullanımından sonra kontrol edebileceğiz.
<?php require 'Car.php';
$car = new Car;
$car->setName('Bugatti');
echo $car->getName();
Car sınıfında public olarak belirtilen $name niteliğin private en azından protected olarak ayarlanması daha doğru olur. Çünkü bu değeri değiştirebilen bir setName() yöntemi zaten mevcutken niteliğinde public olarak tanımlanması doğru bir uygulama değildir. Bu durum sınıfın çalışmasını bozabilecek istenmeyen kullanımlara neden olabilir.
<?php require 'Car.php';
$car = new Car;
$car->setName('Bugatti');
$car->name = 'Ferrari';
echo $car->getName();
# Protected
Bu görünüme sahip nesnelere sınıfın kendisi de dahil alt ve üst sınıflardan erişebilir hale getirir. Sınıf dışında ise kullanımı mümkün değildir. Yukarıdaki Car sınıfı örneğimizle devam edelim. Mesela Car sınıfında public olarak belirtilmiş $name niteliği setName() yöntemi ile manipüle edilebildiği için public olarak belirtilmiş olması gereksizdir.
class Car
{
protected $name;
public function setName(string $name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
}
Yukarıdaki örnek kullanımda artık $name niteliğine dışarıdan erişilemeyecektir.
<?php require 'Car.php';
$car = new Car;
$car->setName('Bugatti');
echo $car->getName();
Görünümü public ayarlanmamış bir nitelik veya yönteme erişim alanı dışından erişilmeye çalışırsa sistem yakalanamayan ölümcül bir hata verir.
<?php require 'Car.php';
$car = new Car;
$car->setName('Bugatti');
$car->name = 'Ferrari';
echo $car->getName();
Protected ile belirtilmiş nesnelere sınıf dışından erişilemese de üst sınıftan erişilebilir. Üst sınıf kavramına daha sonra değineceğiz.
# Private
En düşük kapsamlı görünürlük deyimidir. Bu görünüme sahip nitelik ve yöntemlere aynı sınıf dışında asla erişilemez. Bu görünümü bu durumu göz önüne alarak kullanmaya özen gösterin.
class Car
{
private $name;
}
Yukarıdaki örnek kullanımda artık $name niteliğine ne dışarıdan ne de üst sınıftan erişilemeyecektir.
<?php require 'Car.php';
$car = new Car;
$car->name = 'Ferrari';