Static - Statische Attribute und Methoden/Funktionen

In einer „normalen“ Klassen haben Attribute einen Wert pro Objekt. Sollte der Wert eines Attributes in einem Objekt verändert werden, hat dies keinen Einfluss auf das andere Objekt.

Beispiel:

<?php
	class Person {
		protected $firstName;
	
		public function setFirstName($theFirstName) {
			$this->firstName = $theFirstName;
		}

		public function getFirstName() {
			return $this->firstName;
		}
	}

	$heinz = new Person();
	$heinz->setFirstName('heinz');
	$peter = new Person();
	$peter->setFirstName('peter');
?>

Die Attribute „firstName“ beider Objekte haben einen unterschiedlichen Wert. Für das erste Objekt den Wert „heinz“ und für das zweite Objekt den Wert „peter“.

Es gibt Situationen, in denen ein Attribut jedoch pro Klasse, also für jede Instanz gelten soll.


Ein klassisches Beispiel ist es, wenn das Objekt selbst die Anzahl der Instanzen zählen soll:



<?php
	class Person {
		protected static $instanceCount;
	
		public function __construct($firstName) {
			$this->setFirstName;
			self::$instanceCount++;
		}

		public function getInstanceCount() {
			return self::$instanceCount;
		}

		public function __destruct() {
			self::$instanceCount--;
		}
	}

	$peter = new Person('peter');
	$paul = new Person('paul');
	$heinz = new Person('heinz');

	echo $peter->getInstanceCount();
	echo $paul->getInstanceCount();
?>

Bei beiden Ausgaben mittels echo wird die Zahl 3 ausgegeben, da das Attribut $instanceCount für alle Instanzen des Objektes gilt und sich überall ändern, wenn es in einer Instanz geändert wurde.


Neben statischen Attributen kann es auch statische Methoden geben. Diese werden nicht in der klassischen Objektnotation aufgerufen:



$object->methodName();

sondern mit dem Klassennamen und :: anstand ->:



Classname::methodName();

Statische methoden werden meist genutzt um „lowlevel“ Funktionen in einem Klassennamesraum zu sammeln.

Beispiel:



<?php
	class Util {
		static function sendMail($recipient,$title,$text) {
			...
		}
	}

	Util::sendMail('foo@bar.de','My Message','Blablabla');
?>

Eine weitere Verwendung ist das Singleton Pattern. Ein Singleton ist ein Objekt, von dem es nur eine Instanz geben darf. Dazu wird der Konstruktor des Objektes als „private“ deklariert und eine statische Methode liefert die Instanz:

<?php
class MailService {
	static protected $instance;

	protected $mailCount = 0;

	private function __construct(){
		$this->mailCount = 0;
	}

	public function sendMail($recipient, $title,$text) {
		$this->mailCount++;
		echo "sending the ".$this->mailCount." mail";
	}

	public static function getInstance() {
		if(self::$instance == null) {
			self::$instance = new MailService();
		}
		return self::$instance;
	}
} 

MailService::getInstance()->sendMail('timo@test12.de','test','test2');
MailService::getInstance()->sendMail('timo@test12.de','hallo','hallo timo');
?>

Der Mailservice wird bei einer Skriptlaufzeit nur einmal benötigt, da er nur Arbeit verichtet, aber nicht wie ein Personenobjekt eine Identität hat. Im Beispiel wird bei jeder versendeten Mail der interne (nicht statische) Zähler der Maisl hochgesetzt. An der Ausgabe sieht man also, dass es sich tatsächlich um das selbe Objekt handelt.

Navigation