2010-12-14 8 views
2
public function __construct($template = '', array $data = array()) 
{ 
    if ($template !== '') { 
     $this->setTemplate($template); 
    } 
    if (!empty($data)) { 
     foreach ($data as $name => $value) { 
      $this->$name = $value; 
     } 
    } 
} 

erhielt diese vom DevShed zusammengesetzten Ansicht Tutorial (http://www.devshed.com/c/a/PHP/PHP-Composite-View-Design-Pattern-Introducing- the-Schlüssel-Konzepte/1 /). Jedenfalls bin ich etwas verwirrt, $this->$name = $value; Aussage.PHP-Code: Verwendung dieses Stichwort

Normalerweise verwende ich $this für Klasseneigenschaften und/oder beim Aufrufen von Klassenmethoden innerhalb der Klasse. Plus die Aussage haben zwei $ 's. Was ist komisch! Also ist $this->$name = $value bezogen auf die in der foreach-Schleife definierte $name? Wenn ja, kann jemand diese Verwendung oder Logik dahinter erklären?

Vielen Dank im Voraus.

Antwort

2

Der Name $ in

$this->$name = $value 

Setzt die Variable wie $

auf $ value name definiert

Z.B. wenn $ name = ‚user‘, dann ist dies das Äquivalent zu

$this->user = value; 

Diese Art der Syntax häufig verwendet wird (wie oben gezeigt) in foreach Schleifen Objektwerte einzustellen.

Hinweis: Jedes Mal, wenn $ this-> Variablenname aufgerufen wird, wenn 'Variablenname' nicht bereits als Eigenschaft des Objekts definiert ist, wird die Funktion magic __set aufgerufen, wobei 'Variablenname' als Argument übergeben wird.

Siehe http://php.net/manual/en/language.oop5.overloading.php

+0

Hier stimmt, aber nur wahr, wenn 'name' nicht als Grundbesitz existiert. In diesem Fall werden die magischen Eigenschaften nicht aufgerufen. – KingCrunch

+0

@KingCrunch - Ja, das ist wahr, wird meine Antwort bearbeiten, um es ein wenig klarer zu machen – mrwooster

+0

Ich denke, ich habe es. Nachdem ich mit der AbstractView-Klasse herumgespielt habe. Es scheint, dass sich $ this -> $ name auf einen dynamisch erstellten $ name von __set bezieht. Wenn also beispielsweise eine Klasseneigenschaft in der Klasse nicht explizit definiert wird, kann ein Benutzer grundsätzlich folgendes tun: $ foo = new AbstractView; $ foo-> bar = 'stuff' ;, so dass die __set-Funktion aufgerufen wird und eine bar-Klasseneigenschaft für die abstractview-Klasse erstellt wird. Und $ this -> $ name = $ value-Anweisung bezieht sich auf die Variable $ name, einen Platzhalter, der in den anderen magischen Methoden verwendet wird, die durch die Klasse AbstractView definiert sind, daher das extra $. Ich danke dir sehr! – mythicalprogrammer

0

$ name enthalten die name of property nichts anderes

statt nur die Eigenschaft zu erwähnen statisch ist es auf die Variable zeigt, die den Namen der Eigenschaft enthalten

$name='someproperty'; 

$this->$name; 
0

Let wie nehmen dass der aktuelle Wert von $ name "foo" ist. dann wird $ this-> name genau das selbe wie $ this-> foo zurückgeben.

+0

Sie meinen '$ this -> $ name'.Und nicht * zurück *, sondern * beziehen *. –

1

Ich bin nicht zu dem Link gegangen, den Sie gepostet haben, aber ich habe den Code gelesen.

Ich will Ihnen ein Beispiel geben:

// If $data has the following values 
array(
    'firstname' => 'my first name', 
    'surname' => 'my surname' 
) 

Der Code wird als öffentliche Eigenschaft der Klasse ‚Vorname‘ und ‚Name‘ haben. Die Werte für $this->firstname lauten "Mein Vorname". Der Wert von $this->surname wird "mein Nachname" sein.