2009-08-18 10 views
3

Il semble que différentes instances d'une classe puissent connaître les variables membres privées de l'autre.Scope PHP et interaction d'instance de classe

J'ai fourni du code qui tente de montrer mon problème, et je vais essayer de l'expliquer.

Nous avons une classe avec une variable membre privé, $hidden. modifyPrivateMember définit la valeur de $hidden à 3. accessPrivateMember prend un Object en tant que paramètre et accède à son privé$hidden membre pour renvoyer sa valeur.

code Exemple:

<?php 
// example.php 

class Object { 
    private $hidden; 

    public function modifyPrivateMember() { 
     $this->hidden = 3; 
    } 

    public function accessPrivateMember(Object $otherObject) { 
     return $otherObject->hidden; 
    } 
} 

$firstObject = new Object; 
$firstObject->modifyPrivateMember(); 


$otherObject = new Object; 
echo $otherObject->accessPrivateMember($firstObject); 

sortie du code ci-dessus:

$ php example.php 
3 

Quelqu'un peut-il expliquer pourquoi les membres privés d'objets sont accessibles à d'autres instances de la même classe? Y a-t-il une justification à cette violation manifeste de la portée?

+0

Les réponses jusqu'à présent viennent de me dire ce que le code a illustré. Je cherche vraiment une réponse à la question de * pourquoi * les choses sont comme ça. Pourquoi la visibilité est-elle restreinte à la classe et n'est-elle pas un objet? Quels avantages cela offre-t-il? –

+0

Je ne fais que spéculer en ce moment, mais PHP emprunte allot de Java, y compris le comportement des modificateurs. Peut-être que le Java doit le faire au niveau de la classe à cause du système de type. Peut-être que cela explique pourquoi ruby ​​peut le faire au niveau de l'instance. Mais encore une fois c'est juste une spéculation. – MrHus

Répondre

3

private signifie qu'il est limité uniquement à cette classe, et pas seulement à cet objet.

3

Voilà comment fonctionne php. C'est la même chose que Java. Voir http://php.net/manual/en/language.oop5.visibility.php pour plus d'informations.

+0

Le fait que Java fonctionne comme ceci peut effectivement être une réponse valable pourquoi PHP fonctionne de la même manière. Mais il est intéressant de connaître la vraie réponse qui s'applique à toutes ces langues. –

1

La seule situation où ce comportement a semblé utile était en fonction factory:

class Object 
{ 
    private $state; 

    public static function makeObject() 
    { 
     $obj = new Object; 
     $obj->state = 'some state'; 
     return $obj; 
    } 
} 

Même dans ce cas, il y a une meilleure solution et je suis d'accord avec vous qu'il est une violation de la portée, mais pas ce grand à mon avis. Après tout, celui qui écrit la classe décide si elle a besoin d'accéder à des membres privés à partir d'objets passés en arguments. Donc, cela peut sembler inutile (même pour moi), mais on ne sait jamais. Ce n'est pas comme si vous exposiez vos internes à des sous-classes ou à quelque chose. Tout se passe dans la même classe et c'est ce que vous faites dans votre entreprise. A propos, un langage qui implémente des modificateurs d'accès par objet et non par classe est Ruby.