Components und Eigenschaften

Hallo,

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.’

Was übersehe ich?

thx

getStemmer() ist eine statische Funktion, daher nehme ich an du musst das so machen:


<?php


class Stemmer{

        

        public static $aRules = array();


        public static function getStemmer( $sValue )

        {

                print_r(self::$aRules);

        }

}

?>

thx hat wunderbar geklappt!

obwohl ich nicht verstehe warum meine Lösung nicht funktioniert hat

Du rufst die Methode statisch auf ("::"), hast sie aber nicht als solche definiert. Siehe:

http://de.php.net/ma...oop5.static.php

vorweg

es klappt alles wunderbar.

Aber zum Verständnis nochmal

ich habe folgendes geschrieben




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.

Danke für die ausführliche Erklärung. Ich habe außer Acht gelassen das ich hier mit dem Singleton-Muster arbeite