2008-09-16 8 views
0

En PHP, si vous renvoyez une référence à une propriété protégée/privée à une classe en dehors de la portée de la propriété, la référence remplace-t-elle la portée?La portée de la propriété PHP est-elle ignorée en passant comme référence?

par exemple.

class foo 
{ 
    protected bar = array(); 
    getBar() 
    { 
    return &bar; 
    } 

} 

class foo2 
{ 
    blip = new foo().getBar(); // i know this isn't php 
} 

Est-ce exact et est la barre de réseau étant passée par référence?

+0

Je ne peux pas empêcher de se demander pourquoi vous faites cela, ou si elle est même une bonne idée ... –

+0

Pardonnez-moi, mais l'utilisation une variable publique et perd le besoin de "pirater" l'accès à une variable protégée? Ce que vous faites semble être une assez mauvaise idée ... Peut-être que si vous nous en disiez plus sur ce que vous essayiez d'accomplir, nous pourrions trouver un bon moyen d'y arriver ... –

+0

Ceci est un exemple très spécialisé où j'ai besoin pour accéder à cette propriété (pour normaliser la base de données par rapport au contenu du fichier plat). Pour les autres 99/100 fois cette propriété est accessible, il vaut mieux être privé. – Karan

Répondre

3

Eh bien, votre exemple de code n'est pas PHP, mais oui, si vous renvoyez une référence à une variable protégée, vous pouvez utiliser cette référence pour modifier les données en dehors de la portée de la classe. Voici un exemple:

<?php 
class foo { 
    protected $bar; 

    public function __construct() 
    { 
    $this->bar = array(); 
    } 

    public function &getBar() 
    { 
    return $this->bar; 
    } 
} 

class foo2 { 

    var $barReference; 
    var $fooInstance; 

    public function __construct() 
    { 
    $this->fooInstance = new foo(); 
    $this->barReference = &$this->fooInstance->getBar(); 
    } 
} 
$testObj = new foo2(); 
$testObj->barReference[] = 'apple'; 
$testObj->barReference[] = 'peanut'; 
?> 
<h1>Reference</h1> 
<pre><?php print_r($testObj->barReference) ?></pre> 
<h1>Object</h1> 
<pre><?php print_r($testObj->fooInstance) ?></pre> 

Lorsque ce code est exécuté, les print_r() résultats montreront que les données stockées dans $testObj->fooInstance a été modifié en utilisant la référence stockée dans $testObj->barReference. Cependant, le problème est que la fonction doit être définie comme renvoyant par référence, ET l'appel doit également demander une référence. Vous en avez besoin tous les deux! Voici la page de manuel PHP sur ce point:

http://www.php.net/manual/en/language.references.return.php

+0

Merci, c'était la notation que j'ai été confus au sujet (* les deux * ayant besoin des étiquettes de référence) – Karan

Questions connexes