import Funktion Vorschlag

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
ecomeback
Beiträge: 12
Registriert: 09.11.2007, 13:55:44
Wohnort: Hannover

import Funktion Vorschlag

Beitrag von ecomeback » 27.11.2007, 02:58:54

Code: Alles auswählen

// Verzeichnis Trenner
define('DS', DIRECTORY_SEPARATOR);

Code: Alles auswählen

function import($Namespace,$File,$ActivatePHP5Support = true){

	static $Files = array();

	// Dateinamen zusammenbauen
	$File = APPS__PATH.DS.str_replace('::',DS,$Namespace).DS.$File;

	$Hash = md5($File);

	// Datei bereits geladen?
	if(!isset($Files[$Hash])){
		if(intval(phpversion()) == 5 && $ActivatePHP5Support == true){
			// Dateiendung anhängen
        		$ImportFile = $File.'.php5';

       			// Datei importieren
        		if(!file_exists($ImportFile)){

            			// php5-File annehmen
            			$ImportFile = $File.'.php';

            			if(!file_exists($ImportFile)){
              				trigger_error('[import()] The given module ('.$ImportFile.') cannot be loaded!');
               				exit();
             			// end if
            			}
            			else{
               				$Files[$Hash] = include($ImportFile);
             			// end else
            			}
            		// end if
        		}
            		else{
            			$Files[$Hash] = include($ImportFile);
             		// end else
            		}
        	// end if
        	}
		else{
			// Dateiendung anhängen
         		$ImportFile = $File.'.php';

         		// Datei importieren
         		if(!file_exists($ImportFile)){
           			trigger_error('[import()] The given module ('.$ImportFile.') cannot be loaded!');
            			exit();
          		// end if
         		}
         		else{
            			$Files[$Hash] = include($ImportFile);
          		// end else
         		}
         	// end else
		}
	// end if
	}
// end function
}
Alternativ auch über eine globale Variable, aber das ist ja nicht unbedingt nötig, da man das ja nicht manipulieren muss.

Ich kann derzeit nicht sagen, ob das etwas bringt, ...

Beste Grüße
Guido

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Beitrag von dr.e. » 27.11.2007, 13:36:07

Hallo Guido,

vielen Dank für deine Idee. Mein Feedback:

- ich verwende bisher die Konstante "DIRECTORY_SEPARATOR" nicht, da
ich sowohl auf Windows als auch auf LINUX/UNIX noch keine Probleme
mit einem "/" hatte. Macht aber sicher Sinn das umzustellen.
- Einen eigenen Hashtable für includes() anzulegen finde ich nicht nötig, da
PHP bereits intern einen Hashtable für die *_once()-Funktionen hält.
Das kostet zusätzlichen Speicher, bringt aber keinen effektiven Nutzen.
Möchte ich alle inkludierten Dateien zu einem bestimmten Zeitpunkt
anzeigen, kann ich bequem auf die get_included_files()-Funktion oder
Bibliotheken wie xdebug zugreifen.
- Dein Algorithmus für die Hastable-Keys hat das Problem, dass ein import
schief geht, sobald Dateien in unterschiedlichen Namespaces gleich
heißen. Nehmen wir an, du benennst einen DocumentController in
Modul A "controller" und verwendest diesen Namen ebenso in Modul B,
kommt es zum Problem. Sicher schafft man damit die Möglichkeit,
Klassen-Eindeutigkeit herzustellen, aber hier geht es um die Einbindung
von Dateien, ohne zu betrachten, welche Inhalte diese haben.

Ich werde das Thema "DIRECTORY_SEPARATOR" für das nächste Release aufnehmen.
Viele Grüße,
Christian

ecomeback
Beiträge: 12
Registriert: 09.11.2007, 13:55:44
Wohnort: Hannover

Beitrag von ecomeback » 27.11.2007, 15:54:57

Hallo Christian.

So gesehen ja. Was die Geschwindigkeit angeht, so bin ich da noch zu keinem eindeutigen Ergebnis gekommen was nun schneller oder langsamer ist. Dafür schwanken die Zeiten beim Benchmark einfach zu sehr. Beide Varianten sind auf den ersten Blick nicht nennenswert langsamer.

Ich bin nun drauf gekommen, da ich es bei mir etwas anders angelegt hatte und ich ganz auf Eindeutigkeit setze. Die Sache mit dem Problem habe ich noch nicht verstanden. Ich beziehe mich ja nicht auf den Namespace sondern auf den gesamten Pfad zur Datei. Wird die Datei importiert bzw. inkludiert, reicht es doch wenn sie einmal geladen wird. Woher soll denn ein unterschiedlicher Inhalt bezogen auf unterschiedliche Namespaces kommen, wenn die gleiche bzw. unterschiedliche Dateien geladen werden? Stehe ich auf dem Schlauch?

Grüße
Guido

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Beitrag von dr.e. » 28.11.2007, 00:26:38

Hallo Guido,

ein paar ausführlichere Tests bestätigen auf der Testumgebung, dass die Verwendung von *_once() schneller sind. Ist für mich auch logisch, denn die vorgeschlagene Implementierung ist in PHP verfasst, die PHP-API-Funktionen in C und das sollte - weil bereits kompiliert - schneller sein.

Beim Thema Eindeutigkeit stehst du nicht auf dem Schlauch, hier habe ich die Zeile

Code: Alles auswählen

$Hash = md5($File);
nicht richtig gelesen, denn dort wird der Namespace bereits berücksichtigt. :roll:
Viele Grüße,
Christian

ecomeback
Beiträge: 12
Registriert: 09.11.2007, 13:55:44
Wohnort: Hannover

Beitrag von ecomeback » 28.11.2007, 08:22:18

Hallo Christian,

kannst du diesbezüglich mal eine Zahl nennen? Ist das unabhängig von der Anzahl der *_once? Also macht es einen Unterschied, ob versucht wird innerhalb einer Anfrage die Datei 10-mal zu inkludieren?

Beste Grüße
Guido

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Beitrag von dr.e. » 28.11.2007, 11:27:12

Hallo Guido,

Zahl war im Mittel ~0.0001 - 0.0005 s schneller. Da man recht viele import()'s innerhalb eines Projekts hat, ist das meiner Ansicht nach zwar erst mal wenig, aber in Summe schon entscheidend.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast