2011-05-09 26 views
5

merak dizi özelliklerine sahip (Sadece karşısında amacını almaya çalışırken, kod beklendiği gibi çalışmaz biliyorum) Aşağıdaki:__set/__ olsun o böyle bir şey yapmak mümkün olup olmadığını

class Form 
{ 
    private $v = array(); 

    function __set($varName, $varValue) 
    { 
     ... do some treatment on the varValue ... 
     $this->v[$varName] = $varValue; 
    } 

    function &__get($varName) 
    { 
     if(!isset($this->v[$varName])) 
      $this->v[$varName] = NULL; 

     return $this->v[$varName]; 
    } 
}; 

istediğim için gibi bir değişken ayarlamak mümkün:

$form->Values['whatever'] = 'dirty';

ve bazı temizlik işlemleri arayıp aslında 'HtmlValues' ve 'SqlValues' ben gibi birkaç diğer diziler doldurarak sona ereceğini ayarlayıcı işlevi aracılığıyla çalıştırmak zorunda sadece kodlanmış değerleri alabilir İstediğim biçimi, bu yüzden daha sonra sorun sadece kullanırsanız _ olsun elbette normaldir konudur

echo $form->HtmlValues['whatever'];

çağırabilir, sen geri verdikten bir değeri ayarlayarak sona alabilir ve hatta olsa & _get, referansı ve iş türüne göre döndürür, özel bir üye oluşturmanıza rağmen, __set asla aranmaz. Ne $form->Values['group']['item'] = 'whatever';

İstenen çıkış gibi bir şey olurdu gibi değil potansiyel olarak birden fazla diziler derin ve bir dizi (içinde ayarlayın her bir değerin üzerinde bir işlevi çağırmak için bir yol varsa Yani temelde

, merak ediyorum :

$form->Values['name'] = "&"; 
echo $form->HtmlValues['name']; = & 

cevap

3

(Tıpkı ayarlandıktan olarak her değişkeni aramak sadece yetenek, gerçek kodlama aramıyorum, takviye etmek/manuel dizinin tamamı kodlamak zorunda kalmadan değiştirildi) İstediğiniz ArrayAccess arabirimini uygulamak için. Bağlantılı sayfanın nasıl yapılacağına dair örnekleri vardır.

DÜZENLEME: ArrayAccess bir göz atın

<?php 
class obj implements arrayaccess { 
    private $container = array(); 
    public function __construct() { 
     $this->container = array(
      "one" => 1, 
      "two" => 2, 
      "three" => 3, 
     ); 
    } 
    public function offsetSet($offset, $value) { 
     if (is_null($offset)) { 
      $this->container[] = $value; 
     } else { 
      $this->container[$offset] = $value; 
     } 
    } 
    public function offsetExists($offset) { 
     return isset($this->container[$offset]); 
    } 
    public function offsetUnset($offset) { 
     unset($this->container[$offset]); 
    } 
    public function offsetGet($offset) { 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
} 

$obj = new obj; 

var_dump(isset($obj["two"])); 
var_dump($obj["two"]); 
unset($obj["two"]); 
var_dump(isset($obj["two"])); 
$obj["two"] = "A value"; 
var_dump($obj["two"]); 
$obj[] = 'Append 1'; 
$obj[] = 'Append 2'; 
$obj[] = 'Append 3'; 
print_r($obj); 
?> 
+0

Başar, götürdü doğru yolda :) – John

1

: Erişim kolaylığı için, aşağıda php.net gelen örnek dahil ettik.

0

Bu durumda yaptığım şey, doğrudan dizi yerine ArrayObject uzantısını genişleten bir nesneyi __get() döndürmektir.

private $v; 
public function __construct() 
{ 
    $this->v = new ArrayObject(); // or MyArrayObject() 
    // repeat for each of your "arrays" you want to return 
} 

(bu aynı zamanda diğer durumlarda yararlı olabilir üst sınıfı, doğrudan ArrayAccess uygulayan farklı olduğunu unutmayın.) Burada

bir örnek:

<?php 
class MyArrayObject extends ArrayObject 
{ 
    private $validate; 
    public function __construct($validate) 
    { 
    parent::__construct(); 
    $this->validate = $validate; 
    } 

    public function offsetSet($i, $v) 
    { 
    $validate = $this->validate; 
    if (!$validate($this, $i, $v)) 
     throw new Exception(); 

    parent::offsetSet($i, $v); 
    } 
} 

class Foo 
{ 
    private $v; 
    public function __construct() 
    { 
    $this->v = new MyArrayObject(function(MyArrayObject $me, $i, $v) { 
     // only accept values that are larger than 5 
     return $v > 5; 
    }); 
    } 

    public function __get($key) 
    { 
    if ($key == 'bar') return $this->v; 
    } 
} 

$f = new Foo(); 
$f->bar[] = 10; 
$f->bar[] = 5; // throws exception 
İlgili konular