PHP Kapsam ve Sınıf Instance Etkileşim

3 Cevap php

Bir sınıfın farklı örnekleri birbirlerinin özel üye değişkenleri hakkında bilmek olabilir sanki.

Ben sorunu vitrin dener bazı kod sağladı, ve bunu anlatmaya çalışacağım.

Biz özel bir üye değişkeni ile bir sınıf var, $hidden. modifyPrivateMember $hidden ile değerini belirler 3. accessPrivateMember parametre olarak bir Object alır ve accesses its private $hidden üyesi değerini döndürmek için.

Örnek kod:

<?php
// example.php

class Object {
    private $hidden;

    public function modifyPrivateMember() {
        $this->hidden = 3;
    }

    public function accessPrivateMember(Object $otherObject) {
        return $otherObject->hidden;
    }
}

$firstObject = new Object;
$firstObject->modifyPrivateMember();


$otherObject = new Object;
echo $otherObject->accessPrivateMember($firstObject);

Yukarıdaki kod çıktısı:

$ php example.php
3

Nesnelerin private üyeleri aynı sınıftaki diğer örneklerini erişilebilir neden kimse açıklayabilir misiniz? Bu kapsam görünürdeki ihlali için bazı gerekçeler var mı?

3 Cevap

private o nesne değil, sadece, sadece sınıfla sınırlı demektir.

Php böyle çalıştığını. Bu Java nasıl çalıştığı gibi aynı. http://php.net/manual/en/language.oop5.visibility.php daha fazla bilgi için bkz.

Bu davranış yararlı göründüğümüz yalnızca durum factory fonksiyonu vardı:

class Object
{
    private $state;

    public static function makeObject()
    {
        $obj = new Object;
        $obj->state = 'some state';
        return $obj;
    }
}

Bence bu büyük olmasa da, kapsam ihlali olduğunu bu durumda bile, daha iyi bir çözüm vardır ve sana katılıyorum. O argüman olarak geçirilen nesneler gelen özel üyelere erişmek için gereken tüm sonra, sınıfını yazar bir karar verir. Yani, (hatta benim için) gereksiz görünebilir, ama asla bilemezsiniz. Eğer alt sınıflara ya da bir şey için iç sergilemek konum gibi değil. Hepsi aynı sınıfta olur ve orada ne yaptığınızı sizin iş.

Bu arada, nesne başına değil, sınıf başına erişim düzenleyiciler uygulayan tek dil Ruby.