2010-09-30 3 views
1

J'ai 2 classes A et B qui étendent A. A a une propriété publique et je veux que sur les instances de B cette propriété ne soit pas accessible. J'essaie d'expliquer mieux:PHP rend la propriété de classe héritable

class A 
{ 
    public $prop; 
} 
class B extends A 
{ 
    ... 
} 
$instance=new B; 
$instance->prop; //This must throw an error like "Undefined property prop" 

J'ai essayé avec le mot-clé final mais il est disponible uniquement pour les méthodes non pour les propriétés. J'ai essayé aussi en définissant la même propriété que private sur B mais PHP ne permet pas de changer le niveau d'accès de public à privé ou protégé.

Peut-être y a-t-il une solution simple à ce problème mais je ne peux pas le trouver alors connaissez-vous un moyen de faire cela?

+1

Êtes-vous étendant la classe de quelqu'un d'autre? Pourquoi ne pouvez-vous pas résoudre le problème à son origine? – erisco

+1

Pourquoi voulez-vous déclarer une propriété publique (c'est-à-dire la plus grande visibilité possible), puis refuser son accès aux classes descendantes? –

+0

Je ne veux pas rendre privée une propriété publique je veux que B n'en hérite pas. J'ai changé le niveau d'accès seulement pour trouver une bonne solution mais ça ne marche pas – mck89

Répondre

1

Utilisez magic methods

class A { 
    protected $_prop; 
    public function __get($key) { 
     if ($key=='prop') { 
      return $this->_prop; 
     } 
    } 

    public function __set($key, $value) { 
     if ($key=='prop') { 
      return $this->_prop = $value; 
     } 
    } 
} 

class B extends A { 
    public function __get($key) { 
    } 

    public function __set($key, $value) { 
    } 

    // how you can use it 
    public function foo() { 
     echo $this->_prop; 
    } 
} 
1

Hmm. Rusé!

La seule idée qui vient à l'esprit est de rendre le $prop privé dès le début, et en utilisant magic getter and setter functions pour contrôler l'accès. Vous devez stocker les informations d'accès dans un tableau distinct, puis renvoyer la valeur correcte ou renvoyer une erreur fatale dans la fonction getter.

3

changer simplement public $prop;-private $prop; en faisant $ prop public vous le rendre accessible par tous les moyens possibles, mais ce qui en fait private sera le rendre accessible au sein d'une seule classe

+0

Je cherchais un moyen de préserver la propriété sur la classe de base, mais peut-être qu'il n'y a pas d'autre moyen. – mck89

Questions connexes