Nesne Görünürlüğü


    × Bunları biliyor muydunuz?
"Databases/ dizini bir veritabanı tablolarının şemasını oluşturup Generate::databases() komutu ile bu şemanın gerçek bir veritabanı ve tablo olarak işlenmesini sağlayabilirsiniz."


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;

public

Bu görünüm deyimine sahip yöntem ve niteliklere sınıf dışından erişilebilir.

protected

Bu görünüm deyimine sahip yöntem ve niteliklere alt (child) ve üst (parent) sınıflardan erişilebilir.

private

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.

Dosya: Car.php
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.

Dosya: index.php
<?php require 'Car.php';

$car = new Car;

$car->setName('Bugatti');

echo $car->getName();
Bugatti

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.

Dosya: index.php
<?php require 'Car.php';

$car = new Car;

$car->setName('Bugatti');

$car->name = 'Ferrari';

echo $car->getName();
Ferrari

 

 

# 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.

Dosya: Car.php
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.

Dosya: index.php
<?php require 'Car.php';

$car = new Car;

$car->setName('Bugatti');

echo $car->getName();
Bugatti

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();
Fatal error: Uncaught Error: Cannot access protected property Car::$name in C:\xampp\htdocs\index.php:23 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 4

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';
Fatal error: Uncaught Error: Cannot access private property Car::$name in C:\xampp\htdocs\index.php:10 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 3