Nesneyi çevreleyen Özel erişim?

2 Cevap php

Bir yolu içinde olduğunu kapatan $ hangi nesne bilmek kapalı bir nesne $ için, PHP5.3 de var mı? Esasen ben $ çevreleyen bazı değişkenler özellikle Lütfen bu değişkenler geçirmeden sadece kapalı $ için erişilebilir yapmak istiyorum

class Enclosing {
  private $enclosed;//Enclosed object
  private $othervar;

  function __construct($a,$b){
     $this->othervar=$a;
     $this->enclosed= new Enclosed($b);
  }

}

class Enclosed {
  private $myvar;

  function __construct($a){
    $this->myvar=$a;
  }

  function where_am_i() {//get reference to Enclosing object
    //????
  }
}

Background:

Birden, belki yinelenen Olaylar sahip birden Tarifeleri görüntüleyebilen bir takvim üzerinde çalışıyorum. Ben (onların diğer sakıncaları rağmen kolay dilimleri ve nüks ile ilgili yapmak) taşıma için tarih PHPs DateTime, DateInterval ve DatePeriod nesneleri kullanıyorum. Şu anda benim tasarım şöyle:

Bir Takvim nesne, tüm ekran tarihleri ​​içeren bir DatePeriod denilen $ penceresi var. örneğin Mayıs ayı, 1957.

Takvim de Takvimi nesneleri bir dizi $ programları vardır. $ Programları her üyesi $ pencerenin farkında olmalıdır. Yani Takvim ve zamanlama arasında Observer desen uygulanmaktadır.

Benzer şekilde, her Takvimi onlar tekrarlayan olabilir, çünkü aynı zamanda $ pencerenin farkında olmalıdır Olaylar, bir dizi $ olaylar vardır. Yani program ve etkinlik arasındaki Observer desen uygulanmaktadır.

Tüm bu birden çok diğer nesneler için bu değişiklikleri her zaman $ pencere kopyalama bir çağlayan var demektir.

$ Olaylarda Olaylar kendi kapatan Takvimi kim olduğunu biliyordu ve bu Programı kendi kapsayan Takvim kim olduğunu biliyordu eğer çok daha verimli olacaktır. Bu nesneler $ penceresini kullanmak için gerektiğinde Sonra sadece bunun için sorabilirsiniz.

Herhangi Bunun yapmanın iyi bir yolda düşünceler? Ben başvurabilirsiniz bir model var mı?

2 Cevap

Bu teorik olarak mümkün değildir. Nesne hiç bir şey de "kapalı" değil; Enclosing sınıfının bir örneği, size sadece bu nesnenin bir reference içine alın. Hepsi aynı Enclosed örneğine yerde birçok başvuru var olabilir.

Sen Enclosing sınıf içinde Enclosed bildirmek mümkün olabilir, ama PHP iç sınıflarını destekler eğer ben emin değilim.

Aksi takdirde, sadece Enclosed nesnesi oluştururken Enclosing nesnesine bir başvuru geçmesi ve Enclosed nesnenin bir alanda olduğunu saklayın.

Doğrudan başka bir nesne 'kapatan' bir nesneyi erişmek için bir yol yoktur. Sen kapalı nesne için bir başvuru geçmesi, ya da kapalı nesne bir değişken veri tutmak gerekir ya.