Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [php] überprüfe, ob klasse in datei vorhanden (https://www.delphipraxis.net/114126-%5Bphp%5D-ueberpruefe-ob-klasse-datei-vorhanden.html)

s.h.a.r.k 20. Mai 2008 10:00


[php] überprüfe, ob klasse in datei vorhanden
 
hallo,

ich schreibe mir gerade ein framework in php und scheitere daran, dass ich nicht genau weiß, wie ich das folgende problem angehen soll. und zwar soll mein framework auf einzelnen modulen basieren, welche in einzelnen dateien stecken. in einer solcher modul-datei soll aber nur eine klasse vorkommen, welche eine vordefinierte abstrakte klasse implementieren soll.

kennt ihr möglichkeiten,
... wie man prüfen kann, ob in einer speziellen datei höchstens eine klasse (deren name ich noch nicht kenne) vorhanden ist?
... wie man prüfen kann, wie man diese eine klasse dann auslesen kann?

ich habe irgendwie die befürchtung, dass es darauf hinaus läuft einen eigenen parser dafür zu schreiben, welcher den dateiinhalt analysiert, was allerdings ein wenig arg komplex wäre...

btw: eine idee wäre, die anzahl der vorhandenen klassen vor und nach dem einbinden zu bestimmen (stichwort: get_declared_classes()). aber das finde ich nicht unbedingt die sauberste lösung.

ich hoffe, ihr könnt mir weiterhelfen!

mit freundlichen grüßen
der hai ;)

Phoenix 20. Mai 2008 10:07

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Nein. Dem PHP-Interpreter ist es vollkommen egal, WO etwas deklariert ist.
Demnach merkt er sich auch keinerlei Informationen darüber, was in welcher Datei steckt. Du kannst also nicht herausfinden, was (bzw. in Deinem Fall: Wieviel) in einer Datei steckt.

Ist eine PHP-Datei einmal inkludiert, dann ist sie auch interpretiert und deren Inhalt steht dem Programm zur Verfügung bzw. wird direkt ausgeführt.

Das heisst, die einzige Möglichkeit etwas ungeschicktes zu verhindern wäre tatsächlich, die Datei vor dem includieren zu analysieren und erst zu laden, wenn sie den Anforderungen genügt.

Andererseits: Wieso willst Du den Modulen vorschreiben, nur aus einer Klasse zu bestehen? Wenn es Sinn macht, das ein Modul irgendwelche Helferklassen einsetzt, dann solltest Du als Frameworkentwickler den Modulentwickler nicht dazu zwingen, von guten OOP-Stil abzuweichen und alles in eine Klasse zu zwängen, sondern ihm die Freiheit lassen, ggf. mehrere Klassen zu definieren die er dann benutzt.

s.h.a.r.k 20. Mai 2008 14:55

Re: [php] überprüfe, ob klasse in datei vorhanden
 
darüber habe ich mir auf der fahrt zur uni auch gedanken gemacht und es als wahrlich sinnfrei erachtet nur eine klasse zuzulassen, zumal in der geforderten klasse ja eh eine andere datei mit anderen klassen inkludiert werden können.

nun stellt sich mir aber die frage, wie ich das eben sinnvoll gestalte, da die analyse der datei wahrscheinlich nicht all zu einfach ist, dies aber auch effizient und (am besten immer ;) ) fehlerfrei ablaufen sollte.

ich hoffe du/ihr kannst/könnt mir weiterhelfen!

alcaeus 20. Mai 2008 22:10

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Moin,

ich verwende das in meinem Projekt fuer den Database-Layer. Ich hab meine abstrakte Standardklasse (SQLDatabase), die als Basis fuer alle anderen Klassen dient. In einem eigenen Ordner sind dann die ganzen eigenen Datenbank-Klassen drin (z.B. MySQL4Database in mysql4.php), die am Ende alle dieses Snippet beinhalten:
Code:
if (isset($define_dbms))
{
   $available_dbms['mysql4'] = array(
      'file' => 'mysql4.php',
      'classname' => 'MySQL4Database'
   );
}
Die Datei, die die Datenbankverbindung aufmacht, macht dann erstmal das:
Code:
$available_dbms = array();
$files = get_filelist($root_path .'common/includes/classes/db/', '*.php');
$define_dbms = true;
foreach ($files as $db_file)
{
   include($db_file);
}
unset($files);
unset($define_dbms);
get_filelist ist eine eigene Funktion, die mir den Inhalt eines Ordners auflistet. Anschliessend hab ich in $available_dbms alle Datenbankklassen drinstehn, und kann die Datenbankverbindung so aufbauen:
Code:
$db = new $dbclassname(...);
wobei $dbclassname der entsprechende Klassenname ist :)

Greetz
alcaeus

Die Muhkuh 20. Mai 2008 22:17

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Zitat:

Zitat von alcaeus
Code:
$db = new $dbclassname(...);
wobei $dbclassname der entsprechende Klassenname ist :)

:thumb: Super, wusste gar nicht, dass das geht, kann ich bei meinem aktuellen Projekt gerade sehr gut gebrauchen.

alcaeus 21. Mai 2008 00:18

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Wenn du willst kannst du es auch so machen:
Code:
class foobar {
//...
}

$foo = 'bar';
$bar = 'foobar';
$test = new $$foo;
Das kannst du solange machen, bis du nicht mehr weisst wo was drin steht :lol:

Greetz
alcaeus

Die Muhkuh 21. Mai 2008 00:19

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Na, so extrem muss das nun auch wieder nicht sein. :mrgreen:

s.h.a.r.k 21. Mai 2008 11:26

Re: [php] überprüfe, ob klasse in datei vorhanden
 
@alcaeus: danke für deinen hinweis. gefällt mir recht gut der ansatz. allerdings fehlt mir noch eine vorab-prüfung der klassen. aber das muss ich wohl noch selbst implementieren.

alcaeus 21. Mai 2008 11:31

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Zitat:

Zitat von s.h.a.r.k
@alcaeus: danke für deinen hinweis. gefällt mir recht gut der ansatz. allerdings fehlt mir noch eine vorab-prüfung der klassen. aber das muss ich wohl noch selbst implementieren.

Was genau willst du denn machen? Du kannst z.B. mit class_exists() pruefen, ob eine Klasse existiert, oder mit is_subclass_of() bei einem Objekt pruefen, ob es eine bestimmte Klasse als parent hat.

Erklaer mal kurz was du noch pruefen willst?

Greetz
alcaeus

s.h.a.r.k 21. Mai 2008 16:27

Re: [php] überprüfe, ob klasse in datei vorhanden
 
Gedacht war folgender, normaler Ablauf beim Aufruf einer Seite (bsp: http://www.test-website.de/news.php):

Code:
1. Kern-Modul wird geladen. Dies sei vorhanden und funktioniert.
2. Kern-Modul schaut in Datenbank, welche User-Module installiert sind und bindet diese ein.
3. Instanziieren der passenden Klasse.
4. Ausführen der User-Module. (bsp: Methode execute(), oder dergleichen)
Wie werden User-Module installiert?
In der Administration werden die vorhandenen User-Module angezeigt, welche sich in einem bestimmten Ordner befinden müssen. An dieser Stelle ist es wichtig eine gute Prüfung zu haben, welche die User-Module auf Korrektheit überprüft. Dabei tritt eben die Fragen auf, ob sich in der Datei eben eine Klasse befindet, welche von der abstrakten Klasse abgeleitet ist, und wenn ja, wie nennt sich diese Klasse. Wenn diese Prüfung durchläuft und der Kern die "main"-Klasse (es kann ja evtl. mehrere geben) ermittelt hat, dann wird von dieser Datei ein Hash-Wert gebildet und diese Informationen landen dann in der Datenbank. Anhand des Hash-Wertes wird dann bei obigen Punkt 2 geprüft, ob sich die Klasse geändert hat. Ebenso wird dann aus der DB der Name der Klasse geladen, worüber dann eine Instanz gebildet werden kann.

Ich will eben vermeiden, dass es zu viele includes gibt.

Ich weiß nicht, ob das ein optimales System ist, da es schon ein paar Ecken gibt, mit denen ich nicht ganz zufrieden bin, aber mir ist bisher nichts besseres eingefalllen :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz