2016-08-08 24 views
0
<?php 

class Foo{ 
    public $basket; 

    public function __construct() 
    { 
     $this->basket = 1; 
    } 

    public function getBasket(){ 
     return $this->basket; 
    } 
} 

class Bar{ 
    public function __construct(&$basket) 
    { 
     $basket++; 
    } 
} 

$newFoo = new Foo(); 
$newBar = new Bar($newFoo->getBasket()); 

echo $newFoo->getBasket(); 

?> 

Ich hoffe, den $basket Wert in einer Klasse zu initialisieren und die gleiche Variable über eine andere Klasse zu manipulieren. Leider bekomme ich immer die Fehlermeldung "Hinweis: Nur Variablen sollten durch Referenz übergeben werden".Referenzieren der gleichen Variablen über zwei verschiedene Klassen

Frage: Wie kann ich den Code ändern, um dies zu ermöglichen? Vielen Dank.

+0

Ich würde es auf diese Weise, wie etwas nicht tun können, den Korbinhalt ändern und das ist nicht leicht zu pflegen. Ich hätte eine separate Klasse namens Basket. Nun geben Sie Foo und Bar die gleiche Instanz des Korbs und sie können sie nach Bedarf hinzufügen - aber der Zugriff wird kontrolliert. [Demonstration bei eval.in] (https://eval.in/619687). Imo, eher einfacher zu testen, zu debuggen und neue Funktionen hinzuzufügen. –

+0

Hallo Ryan. Guter Punkt, und ich mag, was Sie dort getan haben. Ich arbeite an einer MVC Online-Shopping-Plattform. Die Absicht dieser Frage ist herauszufinden, wie man ein Objekt (Modelldarstellung der Reihenfolge) zwischen verschiedenen Seiten von PHP teilen kann. Dies ist eine separate Frage, die ich in naher Zukunft stellen werde. – taylorswiftfan

+0

[Klarere Demonstration als Eval.in] (https://eval.in/619689) - räumte die Echos auf. –

Antwort

0

ändern

$newBar = new Bar($newFoo->getBasket()); 

Um

$basket = $newFoo->getBasket(); 
$newBar = new Bar($basket); 

Der erste Weg nicht funktioniert, weil PHP hat keine Variable, mit der um den Wert zu halten Sie new Bar() Als Folge sind vorbei Nichts kann als Referenz weitergegeben werden.

Der zweite Weg funktioniert, weil die $basket var eine feste Referenz im Speicher vorhanden ist, so kann es unter Bezugnahme auf new Bar()

Sie fragte in den Kommentaren übergeben werden:

habe meinen Code geändert zu Ihnen. echo $ newFoo-> getBasket(); produziert 1 (ich hatte auf 2 gehofft).

1 produziert wird, weil jeder Aufruf getBasket() gibt Ihnen eine frische Kopie des Klassenvariable. Die $basket, die ich an new Bar() weitergegeben habe, ist gleich 2, aber das ist nicht das, was du widerspielst.

Wenn Sie das Ergebnis der getBasket() und die Variable $basket wollen auf die gleiche Referenz im Speicher beziehen, müssen Sie zwei Änderungen vornehmen:

Ändern Sie die Funktionsdeklaration:

public function &getBasket() 

ändern, wie Sie die Funktion Ergebnis speichern zu:

$basket = &$newFoo->getBasket(); 

Jetzt Ihr Echo wird 2 zurück, weil Sie einen einzigartigen Korb Bezug haben würden Ihren Code im gesamten

See the docs

+0

Hallo BeetleJuice, habe meinen Code oben geändert.'echo $ newFoo-> getBasket();' erzeugt '1' (ich hatte auf' 2' gehofft). Was kann ich tun, um das möglich zu machen? – taylorswiftfan

+0

Sie suchten nach der Inkrementierung von '$ basket' ​​Variable von' Foo' die falsch ist eigentlich müssen Sie Funktion von 'Bar' aufrufen, um zu bekommen, dass Ihr Code tatsächlich funktioniert oder nicht @ taylorswiftfan –

+0

@taylorswiftfan Sie bringen ein anderes Problem als das Original (das war der Fehler, den Sie bekommen). Wenn Mein Code das Problem löst, wählen Sie bitte und upvote. Was deinen letzten Kommentar angeht, habe ich meine Antwort erweitert. Schau es dir noch einmal an. – BeetleJuice