Question

Je crée une fonction __get () pour une classe pour contrôler l'accès à mes variables membres privées. Ai-je besoin de concevoir la fonction pour gérer toutes les valeurs de membre possible lit ou je ne peux pas écrire pour les membres qui sont publics? En outre, je suppose que les classes héritant de cette classe utiliseront ma fonction __get () pour accéder aux membres privés.

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

  function __get($item){
    return $collection[$item];
  }
Était-ce utile?

La solution

Non, vous n'avez pas.


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);

Et oui, il:


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

Autres conseils

Eh bien, votre code échouerait sur les éléments privés non définis dans votre tableau. Mais là encore, vous pouvez l'utiliser comme un moyen de faire face à ce qui est dans et hors de votre tableau, en tant que tel;

  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
       }
    }
  }

Les classes qui héritent vos appels utiliseront cette __get (), mais peut être surpassée, donc utiliser parent :: __ construct () pour explicity. Notez également que ceux-ci ne peuvent pas être statiques. Pour en savoir plus .

Tout d'abord, PHP recherche pour le nom de la propriété dans la définition de la classe et tente de retourner sa valeur. S'il n'y a pas de propriété - PHP essaie d'appeler __get ($ var) et ici vous pouvez retourner tout ce que vous voulez. Ce comportement est un peu déroutant pour ceux qui connaissent les getters / setters Java comme où vous devez les définir vous souhaitez accéder à tous les membres de la classe.

Quand il est confortable à utiliser getters / setters de type Java - vous pouvez écrire quelque chose comme ceci:

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);
    }
}

et ensuite utiliser ce code en définissant getters / setters personnalisés

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

et l'accès aux méthodes définies ainsi:

$obj->myValue = 'Hello world!';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top