2008-09-19 22 views
6

PHP'nin otomatik olarak oluşturulmuş sınıf değişkenlerine sahip bir yöntemi var mı? Ben düşün Daha önce böyle bir şey gördüm ama emin değilim.Dinamik sınıf değişkenleri

public class TestClass { 
    private $data = array(); 

    public function TestClass() { 
     $this->data['firstValue'] = "cheese"; 
    } 
} 

$this->data dizi daima bir ilişkisel dizidir ama onlar tuşları Sınıftan sınıfa değiştirin. Bağlantıyı tanımlamak zorunda kalmadan, 'a $this->firstValue'dan erişmek için uygun bir yol var mı?

Ve eğer, kendisine herhangi olumsuzlukları vardır?

Ya $this->data dizisi Anahtarı içermiyorsa patlayabilir olmayacak bir şekilde bağlantıyı tanımlayan bir statik yöntem var mıdır?

cevap

7

PHP5 "magic" __get() yöntemini kullanın. sihirli __get, __set kullanma

public class TestClass { 
    private $data = array(); 

    // Since you're using PHP5, you should be using PHP5 style constructors. 
    public function __construct() { 
     $this->data['firstValue'] = "cheese"; 
    } 

    /** 
    * This is the magic get function. Any class variable you try to access from 
    * outside the class that is not public will go through this method. The variable 
    * name will be passed in to the $param parameter. For this example, all 
    * will be retrieved from the private $data array. If the variable doesn't exist 
    * in the array, then the method will return null. 
    * 
    * @param string $param Class variable name 
    * 
    * @return mixed 
    */ 
    public function __get($param) { 
     if (isset($this->data[$param])) { 
      return $this->data[$param]; 
     } else { 
      return null; 
     } 
    } 

    /** 
    * This is the "magic" isset method. It is very important to implement this 
    * method when using __get to change or retrieve data members from private or 
    * protected members. If it is not implemented, code that checks to see if a 
    * particular variable has been set will fail even though you'll be able to 
    * retrieve a value for that variable. 
    * 
    * @param string $param Variable name to check 
    * 
    * @return boolean 
    */ 
    public function __isset($param) { 
     return isset($this->data[$param]); 
    } 

    /** 
    * This method is required if you want to be able to set variables from outside 
    * your class without providing explicit setter options. Similar to accessing 
    * a variable using $foo = $object->firstValue, this method allows you to set 
    * the value of a variable (any variable in this case, but it can be limited 
    * by modifying this method) by doing something like: 
    * $this->secondValue = 'foo'; 
    * 
    * @param string $param Class variable name to set 
    * @param mixed $value Value to set 
    * 
    * @return null 
    */ 
    public function __set($param, $value) { 
     $this->data[$param] = $value; 
    } 
} 

ve hala tek dizide tüm değerleri saklarken değişkenleri bir sınıf ayarlanmış olmak istiyorum nasıl __isset kurucular kontrol sağlayacak: O kadar gibi çalışacak.

Bu yardımcı olur umarım :)

İlgili konular