2011-06-17 12 views
5

Bir nesnenin özel mülkünün öğelerini anonim bir işlevle dökmeye çalışıyorum - elbette bunu başka yollarla da başardım, ancak PHP conundrum Başımın tepesinden çözemiyorum, $ foo = $ değerinin altında ve $ foo kullanıyordum - ama bu bana özel şeyleri vermeyecek, yani ... öneri?PHP'de anonim işlevdeki bir nesnenin özel/korumalı özelliklerine erişme

örnek kod: Ne önerim doğrudan yapmak için hiçbir yolu kesinlikle yoktur inanıyoruz

class MyClass 
{ 
    private $payload = Array('a' => 'A element', 'b' => 'B element'); 

    static $csvOrder = Array('b','a'); 

    public function toCSV(){ 
     $values = array_map(
      function($name) use ($this) { return $this->payload[$name]; }, 
      self::$csvOrder 
     ); 
     return implode(',',$values); 
    } 
} 

$mc = new MyClass(); 
print $mc->toCSV(); 
+1

["Özel değişkenlerin bir kapatma içinde erişilmesi"] (http://stackoverflow.com/q/3722394/90527), ancak NikiC'nin yanıtı, kamuya açık olmayan özelliklerin yanı sıra, kamuya açık olmayan yöntemlere erişmek için de çalışır. bu yüzden kapatma için oylama değil. – outis

cevap

3

.

Bununla birlikte, anonim bir yöntemi bir sınıf yöntemi yaparak (bu sizin için istenen bir şey değil, ancak pratik bir çözüm olabilir) veya $this dışına çıkardığınız her şeyi açık bir şekilde çekip çıkartarak geçirebilirsiniz. Değerler:

class MyClass 
{ 
    private $payload = Array('a' => 'A element', 'b' => 'B element'); 

    static $csvOrder = Array('b','a'); 

    public function toCSV(){ 
     $payload = $this->payload; 
     $values = array_map(
      function($name) use ($payload) { return $payload[$name]; }, 
      self::$csvOrder 
     ); 
     return implode(',',$values); 
    } 
} 
+0

Gerçekten - kodunuz, bu durumda yaptığım şeyi yansıtıyor. Oh, genel olarak ilginç bir problem - sadece habersiz olduğum konuya hitap etmenin bir yolu olduğunu umuyordum. Cevabınız için teşekkürler :) – Wagemage

+0

+1 Daha önce bununla bir cevap gönderdim, daha önce söylediğini farkettim. En basit çözüm genellikle en iyisidir. –

1

Kendin söylediğin gibi, bu özel ve erişilebilir.

Şunları yapabilirsiniz:

  • anonim işlevine bir parametre olarak $ this-> yükü geçirin.
  • Sınıfta bir yöntem oluşturun ve bunun yerine kullanın.
3

Tüm özellik ve yöntemlere erişebilmeniz için Yansıma'yı kullanan bir sarıcı oluşturarak sınırlamayı kesebilirsiniz. Bunu daha sonra gibi kullanabilirsiniz:

İşte
$self = new FullAccessWrapper($this); 
function() use ($self) { /* ... */ } 

here alınan sargının bir örnek uygulama: Açıkçası

class FullAccessWrapper 
{ 
    protected $_self; 
    protected $_refl; 

    public function __construct($self) 
    { 
     $this->_self = $self; 
     $this->_refl = new ReflectionObject($self); 
    } 

    public function __call($method, $args) 
    { 
     $mrefl = $this->_refl->getMethod($method); 
     $mrefl->setAccessible(true); 
     return $mrefl->invokeArgs($this->_self, $args); 
    } 

    public function __set($name, $value) 
    { 
     $prefl = $this->_refl->getProperty($name); 
     $prefl->setAccessible(true); 
     $prefl->setValue($this->_self, $value); 
    } 

    public function __get($name) 
    { 
     $prefl = $this->_refl->getProperty($name); 
     $prefl->setAccessible(true); 
     return $prefl->getValue($this->_self); 
    } 

    public function __isset($name) 
    { 
     $value = $this->__get($name); 
     return isset($value); 
    } 
} 

tüm yönlerini (kapsamaz Yukarıdaki uygulama örn yapamıyor sihirli özellikleri ve yöntemleri kullanın).

+0

İlginç bir şekilde kötü :) Tabii ki muhtemelen üretim için ne yapardım, ama * sorunu çözer * teşekkürler – Wagemage

İlgili konular