Görünürlük

Bir özelliğin ya da bir yöntemin (PHP 7.1.0 ve sonrası) görünürlüğü, bildirim sırasında önüne şu anahtar sözcüklerden biri getirilerek belirlenebilir: public, protected ya da private. public olarak bildirilmiş özelliklere ve yöntemlere her yerden erişilebilir. protected bildirimli özelliklere ve yöntemlere sadece tanımlandığı sınıfdan, ebeveyn sınıflardan ve miras alınarak private bildirimli özelliklere ve yöntemlere ise sadece özelliğin tanımlandığı sınıfın içinden erişilebilir.

Özelliklerin Görünürlüğü

Sınıf özellikleri public, protected ya da private olarak tanımlanmalıdır. Bir özellik sadece var kullanarak bildirilmişse public olarak bildirilmiş gibi ele alınır.

Örnek 1 - Özellik bildirimi

<?php
/**
 * Sınıfım tanımı
 */
class Sınıfım
{
    public 
$genel 'Genel';
    protected 
$korumalı 'Korumalı';
    private 
$özel 'Özel';

    function 
selamVer()
    {
        echo 
$this->genel;
        echo 
$this->korumalı;
        echo 
$this->özel;
    }
}

$nesne = new Sınıfım();
echo 
$nesne->genel;    // Çalışır
echo $nesne->korumalı// Ölümcül Hata
echo $nesne->özel;     // Ölümcül Hata
$nesne->selamVer();    // Genel, Korumalı ve Özel görüntüler


/**
 * ÖbürSınıfım tanımı
 */
class ÖbürSınıfım extends Sınıfım
{
    
// public ve protected özellikleri yeniden tanımlayabiliriz,
    // ancak private olanlar tanımlanamaz
    
public $genel 'Genel2';
    protected 
$korumalı 'Öbür korumalı';

    function 
selamVer()
    {
        echo 
$this->genel;
        echo 
$this->korumalı;
        echo 
$this->özel;
    }
}

$nesne2 = new ÖbürSınıfım();
echo 
$nesne2->genel;    // Çalışır
echo $nesne2->korumalı// Ölümcül Hata
echo $nesne2->özel;     // Tanımsız

$nesne2->selamVer();    // Genel2, Öbür korumalı ve Undefined görüntülenir

?>

Bilginize: PHP 4'te bir değişken bildiriminde (public yerine) kullanılan var anahtar sözcüğü uyumluluk adına hala desteklenmektedir. PHP 5'in 5.1.3 sürümünden önceki sürümlerinde var kullanımı bir E_STRICT uyarısına sebep olurdu.

Yöntem Görünürlüğü

Sınıf yöntemleri public, protected ya da private olarak tanımlanmalıdır. Bunlardan herhangi biri kullanılmadan yapılmış yöntem tanımlarının public kullanılarak tanımlandığı varsayılır.

Örnek 2 - Yöntem bildirimi

<?php
/**
 * Sınıfım tanımı
 */
class Sınıfım
{
    
// public kurucu bildirimi
    
public function __construct() { }

    
// public yöntem bildirimi
    
public function Genel() { }

    
// protected yöntem bildirimi
    
protected function Korumalı() { }

    
// private yöntem bildirimi
    
private function Özel() { }

    
// Bu da public bir yöntem
    
function Falanca()
    {
        
$this->Genel();
        
$this->Korumalı();
        
$this->Özel();
    }
}

$sınıfım = new Sınıfım;
$sınıfım->Genel();    // Çalışır
$sınıfım->Korumalı(); // Ölümcül Hata
$sınıfım->Özel();     // Ölümcül Hata
$sınıfım->Falanca();  // Public, Protected ve Private çalisir


/**
 * ÖbürSınıfım tanımı
 */
class ÖbürSınıfım extends Sınıfım
{
    
// Bu public bir yöntemdir
    
function Filanca()
    {
        
$this->Genel();
        
$this->Korumalı();
        
$this->Özel();  // Ölümcül Hata
    
}
}

$öbürSınıfım = new Sınıfım;
$öbürSınıfım->Genel();   // Çalışır
$öbürSınıfım->Filanca(); // Genel ve Korumalı çalışır, Özel çalışmaz

class Bar
{
    public function 
dnm() {
        
$this->dnmÖzel();
        
$this->dnmGenel();
    }

    public function 
dnmGenel() {
        echo 
"Bar::dnmGenel\n";
    }

    private function 
dnmÖzel() {
        echo 
"Bar::dnmÖzel\n";
    }
}

class 
Foo extends Bar
{
    public function 
dnmGenel() {
        echo 
"Foo::dnmGenel\n";
    }

    private function 
dnmÖzel() {
        echo 
"Foo::dnmÖzel\n";
    }
}

$fo = new Foo();
$fo->dnm();  // Bar::dnmÖzel
             // Foo::dnmGenel

?>

Sabit Görünürlüğü

PHP 7.1.0 ve sonrasında, sınıf sabitleri public, private veya protected olarak tanımlanabilir. Bu sözcükler olmaksızın tanımlanmış sabitlerin public olarak tanımlandıkları varsayılır.

Örnek 3 - PHP 7.1.0 ve sonrasında sabit bildirimleri

<?php
/**
 * Tanımla: MyClass
 */
class MyClass
{
    
// public sabit bildirimi
    
public const MY_PUBLIC 'genel';

    
// protected  sabit bildirimi
    
protected const MY_PROTECTED 'korumalı';

    
// private  sabit bildirimi
    
private const MY_PRIVATE 'özel';

    public function 
foo()
    {
        echo 
self::MY_PUBLIC;
        echo 
self::MY_PROTECTED;
        echo 
self::MY_PRIVATE;
    }
}

$myclass = new MyClass();
MyClass::MY_PUBLIC// Çalışır
MyClass::MY_PROTECTED// Ölümcül hata
MyClass::MY_PRIVATE// Ölümcül hata
$myclass->foo(); // genel, korumalı ve özel çalışır


/**
 * Tanımla: MyClass2
 */
class MyClass2 extends MyClass
{
    
// public
    
function foo2()
    {
        echo 
self::MY_PUBLIC;
        echo 
self::MY_PROTECTED;
        echo 
self::MY_PRIVATE// Ölümcül hata
    
}
}

$myclass2 = new MyClass2;
echo 
MyClass2::MY_PUBLIC// Çalışır
$myclass2->foo2(); // genel ve korumalı çalışır, özel çalışmaz
?>

Diğer nesnelerden görünürlük

Aynı türdeki nesneler, aynı örnekler olmasalar bile, diğerlerinin özel ve korunan üyelerine erişime sahip olacaktır. Bunun sebebi, gerçeklenime özgü ayrıntıların bu nesnelerin içindeyken zaten biliniyor olmasıdır.

Örnek 4 - Aynı nesne türündeki özel üyelere erişim

<?php
class Test
{
    private 
$foo;

    public function 
__construct($foo)
    {
        
$this->foo $foo;
    }

    private function 
bar()
    {
        echo 
'Private yönteme erişildi.';
    }

    public function 
baz(Test $other)
    {
        
// private özelliği değiştirebiliriz:
        
$other->foo 'hello';
        
var_dump($other->foo);

        
// private yöntemi de çağırabiliriz:
        
$other->bar();
    }
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

Yukarıdaki örneğin çıktısı:

string(5) "hello"
Private yönteme erişildi.