Bir aşırı mı __ tüm üye değişkenleri yönetmek gerekir olsun?

3 Cevap php

Ben özel üye değişkenleri erişimi kontrol etmek için bir sınıf __ get () fonksiyonu oluşturma. Ben mümkün olan tüm üye değeri okur ya da ben kamu olan üyeleri için yazamam işlemek için fonksiyon tasarım gerek var mı? Ayrıca, bu sınıf miras sınıfları özel üyelere erişmek benim __ get () işlevini kullanın olacağını varsayarak yaşıyorum.

class ClassA{
  private $collection = array();
  public $value;

  function __get($item){
    return $collection[$item];
  }

3 Cevap

Hayır, yok.


class A {
   public $foo = 'bar';
   private $private = array();

   public function __get($key) {
      echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n";
      return $this->private[$key];
   }

   public function __set($key, $val) {
      $this->private[$key] = $val;
   }
}


$a = new A();

var_dump($a->foo);
$a->bar = 'baz';
var_dump($a->bar);

Ve evet, o olacak:


class B extends A { private $private = array(); }
$b = new B();
var_dump($b->bar);

Peki, sizin kodu dizideki set değil özel öğeleri başarısız olur. Ama sonra tekrar, sen gibi, senin dizinin içinde ve dışında ne ile başa çıkmak için bir yol olarak kullanabilirsiniz;

  function __get($item){
    if ( isset ( $collection[$item] ) )
       return $collection[$item];
    else {
       try {
          return $this->$item ;  // Dynamically try public values
       } catch (Exception $e) {
          $collection[$item] = 0 ; // Make it exist
       }
    }
  }

Aramalarınızı miras sınıfları bu __ get () kullanır, ancak geçersiz olabilir, böylece explicity için parent :: __construct () kullanın. Ayrıca bu statik olamaz unutmayın. Further reading.

Tüm PHP birinci sınıf tanımında özellik adı arar ve değerini döndürmeye çalışır. Hiçbir özellik varsa - PHP __ get ($ var) aramak ve burada istediğiniz bir şey dönebilirsiniz çalışır. Bu size erişmek istediğiniz her sınıf üyesi için onları tanımlamak zorunda Java benzeri alıcılar / ayarlayıcıları bilenler için biraz kafa karıştırıcı bir davranıştır.

Java gibi alıcılar / ayarlayıcıları kullanmak için rahat - Eğer böyle bir şey yazabilirsiniz:

public function __set($var, $value)
{
	if (method_exists($this, $method = "_set_" . $var))
	{
		call_user_func(array($this, $method), $value);
	}
}
public function __get($var)
{
	if (method_exists($this, $method = "_get_" . $var))
	{
		return call_user_func(array($this, $method), $value);
	}
}

ve daha sonra özel alıcılar / ayarlayıcıları tanımlayarak bu kodu kullanabilirsiniz

protected function _get_myValue() 
     {
         return $this->_myValue; 
     }
protected function _set_myValue($value)
{
    $this->_myValue = $value;
}

ve tanımlanmış yöntemlerine erişim bu şekilde:

$obj->myValue = 'Hello world!';