hotti: Klassenhierarchie in Verzeichnisstruktur abbilden

hi, s. Thema.

Bisher habe ich die Abhängigkeiten wie folgt visualisiert:

-----------------------------------------------------------
| Klasse                     | Dateiname                    |
 -----------------------------------------------------------
| MySQL                      | MySQL.php                    |
 -----------------------------------------------------------
| MySQL_Article              | MySQL_Article.php            |
 -----------------------------------------------------------

usw. aber das wird, da es alles in _einem_ Verzeichnis liegt, möglicherweise unübersichtlich.

Idealerweise hätte ich das so wie in Perl:

-----------------------------------------------------------
| @INC beeinhaltet z.B. /home/hotte/perllib/                |
 -----------------------------------------------------------
| Klasse                     | Dateiname                    |
 -----------------------------------------------------------
| MySQL                      | MySQL.pm                     |
 -----------------------------------------------------------
| MySQL::Article             | MySQL/Article.pm             |
 -----------------------------------------------------------

D.h., Perl konvertiert selbstständig eine visuell mit '::' dargestellte Klassenabbleitung zum '/' um dies auf die unterhalb @INC liegende Verzeichnisstruktur abzubilden. Beispiel:

  
use MySQL;  
# Datei /home/hotte/perllib/MySQL.pm wird eingebunden  
  
use MySQL::Article;  
# Datei /home/hotte/perllib/MySQL/Article.pm wird eingebunden  

Ideen für PHP?

Hotti

  1. Hi,

    PSR-0 ist eine Antwort.

    Bis die Tage,
    Matti

    1. Moin!

      PSR-0 ist eine Antwort.

      Ist die einzige Antwort. Der Composer baut dafür sogar das passende Autoloading, wenn man ihn nutzt - sehr praktisch.

      - Sven Rautenberg

    2. Hi,

      PSR-0 ist eine Antwort.

      Danke für den Hinweis. Optisch sieht das schonmal gut aus bei mir:

        
      // In der Datei, wo die Klasse 'Article' gebraucht wird  
      include "MySQL/Article.php";  
        
      // In der Datei 'Article.php' als abgeleitete Klasse  
      include "MySQL.php";  
      class Article extends MySQL{}  
      
      

      Weitere von MySQL abgeleitete Klassen werden dann im Verzeichnis MySQL/ liegen.

      Viele Grüße und schönes Wochenende,
      Horst

      1. ...
        class Article extends MySQL{}

        
        >   
        > Weitere von MySQL abgeleitete Klassen werden dann im Verzeichnis MySQL/ liegen.  
          
        Ui, klingt abgefahren! Abseits der Frage, ob dass eine geschickte Hierarchie ist: bist Du da nicht etwas zu nah am gewählten DBMS? PostgreSQL soll ja auch ganz nett sein...
        
      2. Moin!

        Hi,

        PSR-0 ist eine Antwort.

        Danke für den Hinweis. Optisch sieht das schonmal gut aus bei mir:

        Du hast nicht verstanden, was PSR-0 machen kann.

        // In der Datei, wo die Klasse 'Article' gebraucht wird

        eben gerade KEIN

        include "MySQL/Article.php";

        weil Autoloading. Abgesehen davon müsste die Klasse MySQL_Article oder \MySQL\Article heißen, um PSR-0-kompatibel benannt zu sein.

        // In der Datei 'Article.php' als abgeleitete Klasse

        eben gerade KEIN

        include "MySQL.php";

        weil Autoloading.

        class Article extends MySQL{}

        Dass ein Artikel von MySQL erbt, ist überdies extrem grausam. Was hat ein Artikel mit einer Datenbank zu tun - außer der Tatsache, dass er in einer abgespeichert sein KÖNNTE, es aber nicht muss?

        Weitere von MySQL abgeleitete Klassen werden dann im Verzeichnis MySQL/ liegen.

        Bloß nicht! Was willst du denn alles ableiten? Nichts von dem, was man in der Regel so in Datenbanken gespeichert hat, hat unabdingbar etwas mit derselben zu tun! Die Datenbank ist immer nur eine von grundsätzlich mehreren denkbaren Speicherorten, also haben die Klassen, die die gespeicherten Daten repräsentieren, nichts mit dem Speichersystem gemeinsam, sollten das Speichersystem also auch nicht erben. Sondern das Ergebnis eines Lesezugriffs aus einem Speichersystem übergeben bekommen.

        - Sven Rautenberg

        1. Hi,

          class Article extends MySQL{}
          Dass ein Artikel von MySQL erbt, ist überdies extrem grausam. Was hat ein Artikel mit einer Datenbank zu tun

          hotti scheint der Meinung zu sein, daß OOP für
          Obviously Outstanding Poppycock
          steht - zumindest programmiert er so ...

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        2. Hallo Sven,

          du meinst es gut mit mir, ich achte das und danke Dir!

          Du hast nicht verstanden, was PSR-0 machen kann.

          Doch, ich verstehe sehr gut. Autoloader setze ich jedoch derzeit für einen ganz anderen Zweck ein: Zur Reduzierung des Overhead beim Kompilieren der Sourcen. Beispiel WebShop: Die Sourcen für 'Bestellen', 'Suche in Shop' u.a. werden erst kompiliert, wenn diese Aktionen vom Benutzer durchgeführt werden. Heißt konkret: Die Sourcen für og. Aktionen sind komplett raus aus dem Code, weniger Overhead und mehr Performance beim Surfen im Shop (kannst ja mal gucken, wie flott das Teil läuft).

          Klassenhierarchien hingegen kommen bei mir in feste Verzeichnisstrukturen. Insofern passt PSR-0 nicht zu diesen beiden Dingens.

          Darüber hinaus ist die Codeverteilung auf Responseklassen ein weiteres Merkmal zur Optimierung des Laufzeitverhalten in meinem Framework.

          Dass ein Artikel von MySQL erbt, ist überdies extrem grausam. Was hat ein Artikel mit einer Datenbank zu tun - außer der Tatsache, dass er in einer abgespeichert sein KÖNNTE, es aber nicht muss?

          Die Basisklasse könnte ich genausogut 'Datenbonker' nennen. Aber MySQL ist nunmal nicht PG, nicht Oracle und die Statements sehen von Fall zu Fall völlig verschieden aus. Deswegen heißt die Klasse eben 'MySQL' und wenns eine andere Engine sein muss, werde ich nicht die Statements einer 'Datenbonker.php' umschreiben, sondern 'MySQL.php' gegen 'PG.php' austauschen. Mit dem Austausch des PDO/DBI-Engine-Layers ist es bei weitem nicht getan, diese Erfahrung zu machen war mir bereits mehrmals ein Vergnügen ;)

          Herzliche Grüße aus Oppenheim,
          Horst