2017-01-23 2 views
3

Pourquoi peut print_r voir la propriété privée $ version même si sa portée est définie sur privé?print_r affiche private var. Pourquoi?

class myClass { 

    private $version; 

    public function set_version($value){ 
     $this->version = $value; 
    } 


} 



$class = new myClass(); 
$class->set_version("1.2"); 

echo "<pre>"; 
print_r($class); 
+0

propriétés 'objet private' sont principalement dans le contexte de l'héritage de classe, et la portée interne uniquement. – Martin

+0

Ne supposez pas que «private» signifie «sécurisé». C'est seulement un indicateur de la façon dont cette propriété * devrait être utilisée *, elle ne fournit aucune «sécurité» réelle ou en fait «réelle confidentialité». – deceze

+0

@deceze Privé signifie que c'est seulement à côté de la classe spécifique qu'il est possible de lire et de mettre à jour la valeur de la var ou de la fonction. pourquoi je me demandais comment print_r pouvait encore le voir –

Répondre

4

print_r() montre les propriétés des membres privés à des fins de débogage. Il ne doit pas être utilisé pour sortir un objet à des fins d'affichage (par exemple dans une vue/page). Pour afficher des informations sur un objet, il est probablement approprié de créer une méthode (par exemple, toString) qui renvoie les informations appropriées.

print_r(), var_dump() et var_export() montreront également les propriétés protégées et privées d'objets. Les membres de la classe statique ne seront pas affichés. 1

+0

Pourquoi pas une classe statique? – TheCrazyProfessor

+0

Merci l'homme! : D bien @TheCrazyProfessor c'est une bonne question. –

+0

@TheCrazyProfessor Je présume que c'est une chose de stockage interne ... par ex. peut-être que PHP stocke les variables statiques avec la définition de classe dans un objet et que les instances de cette classe sont dans un objet séparé ... Si vous en voulez vraiment, vous pouvez utiliser une [Classe de réflexion] (http://php.net/ manual/en/reflectionclass.construct.php) (voir [cette réponse] (http://stackoverflow.com/questions/8763994/how-can-i-get-a-list-of-static-variables-in-a -class # answer-8764052) pour plus d'informations aussi) –

0

De plus, à partir de PHP que vous pouvez utiliser 5.6.0 __debugInfo(), qui vous permettra de remplacer ou d'affiner ce que print_r(), var_dump() sorties. Donc, par exemple, en utilisant json encoder et décoder, vous pouvez retourner uniquement les propriétés publiques.

<?php 
class myClass { 

    private $private_var; 

    public $public_var = 'Foobar'; 

    public function setPrivate($value) 
    { 
     $this->private_var = $value; 
    } 

    public function __debugInfo() 
    { 
     return json_decode(json_encode($this), true); 
    } 
} 

$class = new myClass(); 
$class->setPrivate("Baz"); 

print_r($class); 

https://3v4l.org/seDI6

Résultat:

myClass Object 
(
    [public_var] => Foobar 
)