Statische Klassen in PHP automatisch initialisieren

Statische Klassen in PHP automatisch initialisieren

Lassen sich statische Klassen in PHP automatisch initialisieren? Ja! Über einen kleinen Umweg geht auch das.

Klassen verfügen in PHP über magische Methoden. Eine davon ist die Methode __construct(). Diese wird ausgeführt, sobald man eine neue Klasseninstanz erstellt. Hier lassen sich erste Variablen berechnen und Routinen für die Initialisierung ausführen. Zum Beispiel könnte eine Klasse "MySql" in der Methode __construct() die Datenbankverbindung herstellen, da diese Grundlage für viele andere Methodenaufrufe ist:

<?php
class MySql{
 
	public function __construct(){
		//connect to mysql server
	}
 
	public function query($str){
		//Send query to server
	}
 
}
 
$mysql = new MySql();
$mysql-&gt;query('Select something FROM table');

Nutzt man jedoch statische Klassen steht __construct() nicht zur Verfügung. Oft werden statische Klassen daher mit speziellen Methoden zunächst initialisiert.

<?PHP
class MySql{
	
	public static function init(){
		//connect to mysql server
	}
 
	public static function query($str){
		//Send query to server
	}
}
 
MySql::init();//Prepare everything
MySql::query('Select something FROM table');

Was jedoch, wenn man die Initialisierung der Klasse erst durchführen möchte, wenn diese auch tatsächlich verwendet wird? Möchte man die statische Klasse automatisch initialisieren, muss jede verfügbare Methode zunächst prüfen, ob die Klasse bereits initialisiert wurde. Daher: jede Methode ruft zunächst init() auf. Diese Methode prüft, ob die Initialisierung noch nicht durchgeführt wurde. Wenn nicht wird die benötigte Prozedur durchgeführt:

<?PHP
class MySql{
	
	public static $init = false;
 
	public static function init(){
		if(!self::$init){
			//connect to mysql server
 
			self::$init= true;
		}
	}
 
	public static function query($str){
		self::init();
 
		//Send query to server
	}
 
	public static otherMethod(){
		self::init();
		//do something
	}
 
}
 
MySql::query('Select something FROM table');