2008-09-16 9 views
0

Wenn Sie in PHP einen Verweis auf eine geschützte/private Eigenschaft an eine Klasse außerhalb des Bereichs der Eigenschaft zurückgeben, überschreibt die Referenz den Bereich?Der Gültigkeitsbereich der PHP-Property wird überschrieben, wenn Sie als Referenz übergeben werden?

z.B.

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

} 

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

Ist das richtig und wird das Array bar als Referenz übergeben werden?

+0

ich nicht helfen, aber frage mich, warum Sie dies tun, oder wenn es auch eine gute Idee ist ... –

+0

Vergib mir, aber die Verwendung eine öffentliche Variable und verliert die Notwendigkeit, den Zugriff auf eine geschützte Variable zu "hacken"? Was du machst, scheint eine ziemlich schlechte Idee zu sein ... Vielleicht, wenn du uns mehr von dem erzählst, was du erreichen wolltest, könnten wir einen guten Weg finden ... –

+0

Dies ist eine sehr spezialisierte Instanz, wo ich brauche Zugriff auf diese Eigenschaft (zum Normalisieren der Datenbank in Bezug auf den Flatfile-Inhalt). Für die anderen 99/100-mal wird auf diese Eigenschaft zugegriffen, es ist besser, privat zu sein. – Karan

Antwort

3

Nun, Ihr Beispielcode ist nicht PHP, aber ja, wenn Sie einen Verweis auf eine geschützte Variable zurückgeben, können Sie diesen Verweis verwenden, um die Daten außerhalb des Bereichs der Klasse zu ändern. Hier ein Beispiel:

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

Wenn dieser Code ausgeführt wird, die print_r() Ergebnisse zeigen, dass die in $testObj->fooInstance gespeicherten Daten modifiziert wurden unter Verwendung der Referenz gespeichert in $testObj->barReference. Der Catch besteht jedoch darin, dass die Funktion so definiert werden muss, dass sie als Referenz zurückkehrt, und der Aufruf muss auch eine Referenz anfordern. Du brauchst sie beide! Hier ist die entsprechende Seite aus dem PHP-Handbuch auf, dass:

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

+0

Danke, es war die Notation, über die ich verwirrt war (* beide * benötigen referenzierende Tags) – Karan