ich habe eine Component erzeugt und definiere zu Beginn ein Array mit Werten die in den Methoden aufgerufen werden können, jedoch kriege ich ständig eine Fehlermeldung von yii das mein Controller die Eigenschaft nicht kennt!
<?php
class Stemmer{
public $aRules = array();
public function getStemmer( $sValue )
{
print_r($this->aRules);
}
}
?>
Die Component rufe ich in einem Controller auf
Stemmer::getStemmer("HALLO");
exception ‘CException’ with message ‘Eigenschaft "BasicformsController.aRules ist nicht definiert.’
public $aRules = array();
public function getStemmer( $sValue )
{
print_r($this->aRules);
}
Ich greife auf die Variable über $this zu (d.h. nicht statischer Aufruf)
public static $aRules = array();
public static function getStemmer( $sValue )
{
print_r(self::$aRules);
}
self kann ich hier nur benutzen weil ich die Variable als static definiert habe!
Ich könnte mir das an dieser Stelle nur durch das Singleton Muster erklären und das jedes Objekt einmal erstellt wird und somit auch alle Variablen statisch definiert werden müssen
Statische Eigenschaften/Methoden sind quasi direkt an die Klasse angeknüpft und existieren, ohne dass es ein Objekt von der Klasse gibt. Die Klasse selbst ist also so eine Art eigenes Objekt. Über self:: kann innerhalb von Methoden auf dieses Klassenobjekt zugegriffen werden. Alle Objektinstanzen teilen sich dabei das selbe Klassenobjekt. Außerhalb wird statt self:: der Klassenname verwendet.
Auf diese Weise kann man dann das bekannte Singleton erzeugen, indem man eine Resource direkt in der Klasse statisch speichert, so dass alle Objektinstanzen auf die selbe Resource zugreifen können.
Statische Methoden sind auch nützlich für bibliothekartike Funktionssammlungen, für die man keine Objektinstanz benötigt, wie z.B. CHtml. Über einige statische Eigenschaften kann man hier bequem für verschiedene Funktionen Voreinstellungen ändern (z.B. errorCss).
$this ist immer eine Referenz auf das aktuelle Objekt. Im statischen Kontext gibt es kein Objekt. Daher kann man in statischen Methoden nicht mit $this arbeiten. Nehmen wir z.B an, es gäbe zur Laufzeit 10 Instanzen einer Klasse, wie sollte der Interpreter denn erkennen welche Instanz mit $this referenziert werden sollte? Gar nicht.