Verständnis Problem

Also ich hab's jetzt kapiert. Die Objekte sind aufgrund des registry Pattern überall greifbar.
Zwei fragen hab ich noch?

1.
Um registry Pattern werden ja statische Methoden benutzt. D.h. die Daten sind deshalb von überall greifbar oder? Weil es wird ja nirgends das Schlüsselwort Global benutzt?

2.
Ähnlich wie bei send sollte man den autoloader am Anfang der API registrieren oder? Geht ja zumindest mit dem losest der spl? Weil dann spar ich mir doch bei jeder Datei den include und muss mich nicht mehr darum. Also am besten immer am Anfang oder?
 
Zuletzt bearbeitet:
autoloading ist der Mechanismus, der nicht includete Dateien einbindet. Man kann das autoload so bauen, das man seine Klassen so benennt, das über einfaches ersetzen von z.B. Unterstrichen zu Slashes der include aufgebaut werden kann. Anschliessend wird die entsprechende Datei einfach includet oder requirered.

Statische Klassenmethoden braucht man, wenn man keine Instanz der Klasse über das Schluesselwort new machen möchte, bevor man die Methode callen kann. Das hat erst mal nichts mit Singleton zu tun. Anders herum wird ein Schuh draus. Du bruchst eine static Methode, um ein Singleton-Pattern zu implementieren.
 
Ich weis was static macht das ist schon klar.
Aber meine fragen waren nur:

a) am anfang der API ( autoloaden)
b) warum eben die objekte in dem registry pattern vob überall aus greifbar sind**** Es wird nirgends global benutzt******!

Danke
 
a) ja am Anfang wird der Autoloader über die magische Funktion __autoload() registriert (siehe PHP-Manual).

b) Die Variablen und Objekte sind tatsächlich durch die Kombination von public static Methoden und einer oder mehreren privaten static Member-Variablen einer Registry-Pattern-Klasse von überall aus verfügbar. Dadurch wird der globale Scope überflüssig. Globale Variablen sind ohnehin böse ;-)
 
Danke hihi jetzt sind wir zusammen.
Allerletzte noch ( trotz googlen).aber der autoloader muss nicht in jedet datei drinnen stehen reicht ja einmal oder (spl_autoload_register) oder muss dieser in jeder datei am anfang stehen****
 
Den Autoloader musst du nur einmal erstellen. Alle weiteren Klassen wird der Autoloader dann includen, sofern die Dateien gefunden werden, in denen die Klasse definiert ist.

In Zend-Framework (das kann man prinzipiell auf alle Frameworks irgendwie runterbrechen) gibt es die Klasse Zend_Application, diese wird einmalig über include('Zend/Application.php') eingebunden. In dieser wird der Autoloader einmalig registriert und anschließend über einige Helper-Klassen die Bootstrap-Klasse der jeweiligen Web-Anwendung aufgerufen.

Ohne Zend wäre es folgender Schritt:

- Include-Pfad um den Pfad der aktuellen Anwendung erweitern (set_include_path(), get_include_path() werden hier verwendet)
- Funktion __autoload() implementieren
- Beliebige Klasse durch den Klassennamen einbinden ($user = new User() << funktioniert dann ohne include 'User.php' )

Du musst auch nicht spl_autoload_register verwenden, es genügt, wenn es eine Methode __autoload() gibt, wie an dem Beispiel aus dem PHP-Manual entnommen werden kann:

PHP:
<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Das ganze funktioniert dann rekursiv. Wenn du beispielsweise eine Klasse MVCRenderer hast, in der es eine Methode "render()" gibt, die wiederum andere Hilfsklassen ruft, muss dort auch kein include() oder require() verwendet werden.
 
Zurück