Ankündigung

Einklappen
Keine Ankündigung bisher.

Klassensammlung über ein Objekt zur Verfügung stellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Klassensammlung über ein Objekt zur Verfügung stellen

    Liebe PHP'ler,

    ich habe eine fixe Idee, weiß aber nicht, ob so etwas überhaupt möglich oder
    sinnvoll ist. Ich möchte eine Sammlung von Klassen über ein Objekt
    zur Verfügung stellen. Dabei unterteile ich unterschiedliche Klassen in
    einzelne Dateien (klasse.class.php) und möchte dann schreiben.

    PHP-Code:
    <?php
    $helper 
    = new helper();
    $helper->call_classes'params, forms' );
    ?>
    Und stelle mir dann vor, dass ich über die Klasse call_classes die jeweiligen
    Klassen anschubse und mit die jeweiligen Methoden im Objekt $helper
    zur Verfügung stehen. Ist das unsinnig so etwas zu machen oder ist das
    technisch gar nicht möglich? Bis jetzt hat es noch nicht funktioniert. Ich
    hatte mir das so gedacht, dass

    PHP-Code:
    <?php
    function call_classes$class 
    {
        
    $classes     explode','$class );
        foreach( 
    $classes as $class 
        {
            
    $file dirname(__FILE__) .'/classes/'strtolowertrim$class ) ) .'.class.php'
            if( 
    file_exists$file  ) ) 
            {
                include_once( 
    $file  );
            } 
            else 
            {
                
    $this->_error['call'][] = 'class ' .  $class .' don\'t exist'
            }
        }    
    }
    ?>
    Das scheint nicht wirklich zu funktionieren, habt ihr das eine Lösung oder
    sollte ich lieber von dieser Idee Abstand nehmen?

  • #2
    Schau mal nach Factory-Pattern. Soweit ich dich verstanden habe, entspricht es deiner gewollten Funktionalität.
    Nicht jeder Fehler ist ein Bug.

    Kommentar


    • #3
      Hallo und willkommen hier im Forum!
      Zunächsteinmal solltest du deine Absicht erklären.

      Wenn du auf Komfort aus bist, solltest du eine __autoload-Funktion erstellen:
      http://www.php.net/__autoload
      Diese lädt dir benötigte Klassen zur Laufzeit (ohne eigenes Hinzutun).

      Wenn du deine Helper->call_classes() behalten möchtest, würde ich die Klassennamen wohl eher Parameter-weise übergeben:
      PHP-Code:
      <?php
      function helper()
      {
        
      $classes func_get_args();
        foreach (
      $classes as $class) {
          @require_once 
      'mein/pfad/zu/den/klassen/'.$class.'.class.php';
          if (!
      class_exists($class)) {
            
      // fehler
          
      }
        }
      }
      ?>

      Übrigens so ganz verstehe ich nicht warum du überhaupt die ganzen Klassen in einem Objekt sammeln möchtest. Willst du einen künstlichen Namespace erzeugen, oder die Kontrolle über die Anzahl der Instanzen (siehe Singleton-Pattern) behalten?

      Kommentar


      • #4
        Danke. Da gab es gleich einiges zu lernen. Pattern, __autoload, func_get_args.
        Um erst einmal einen kleinen Überblick zu bekommen, habe ich mir das mal auf die Schnelle angesehen. Bin natürlich noch nicht ganz durch, aber da gibt es ja auch ne Menge zu entdecken.

        Zunächst bin ich nicht von einem bestimmten Pattern etc. ausgegangen, sondern hatte die Idee, dass es sinvoll sein könnte sich über ein Objekt eine Schnittstelle auf andere Klassen zu schaffen, die sich leicht einbinden lassen. Ist das mit "künstlichen Namespace" gemeint. Sorry, aber mit diesen Fachbegriffen ist es erst einmal nicht so weit her.

        Ich habe ein paar der Ideen eingebaut und muss mich da erst noch weiter einlesen, die Klassen werden auf jeden Fall geladen, nur weiß ich nicht wie man die Klassen in den inkludierten Dateien über das Objekt anspricht. Die Klassen dürfen ja nicht so heißen wie die "Stammklasse" aber die Funktion wird nicht gefunden, wenn ich die Klassen in den Dateien über $helper->tuwas(); ansprechen möchte. Irgendwie kann ich mir schon vorstellen, dass das nicht so einfach funktioniert, aber auch da gibt es doch bestimmt eine Lösung, die ich noch nicht auf dem Schirm habe?

        Kommentar


        • #5
          Achje, ich hab nun eine ganz Zeit lang sehr viel ausprobiert, aber ich bekomme es nicht hin über das einmal erstelle Objekt Zugriff auf die anderen Klassen zu bekommen.

          Mir wird jedes Mal auf Neue verkündet, dass
          Fatal error: Call to undefined method helper::_foo()
          Ist ja klar, dass ich ohne mein Zutun nicht einfach die Funktion aus der externen Klasse als Methodenaufruf des Objekts verwenden kann. Allerdings komme ich da kein Stück voran. Die Klassen werden includiert, aber das reicht natürlich noch nicht. Ich möchte als über das Objekt $helper direkt Methoden der anderen Klassen im Stile von $helper->_foo(); ansprechen.

          Geht das überhaupt oder wie muss man an die Sache herangehen?
          Mag ja auch sein, dass ihr mich falsch verstanden habt und ich hier etwas zu zaubern versuche, was so nicht funktionieren kann.

          Kommentar


          • #6
            Hallo,
            also ich glaube du hast dich da in etwas verrannt. Du möchtest beliebige Objekte mit beliebigen Methoden über eine zentrale Helper-Klasse ansprechen, habe ich das richtig verstanden?

            Dann mache dich vertraut hiermit:
            http://www.php.net/manual/de/languag...verloading.php
            http://www.php.net/manual/de/languag...reflection.php
            Möglicherweise noch dies hier:
            http://www.php.net/call_user_func_array

            Reflections sind sehr mächtig, allerdings rate ich dir von deinem Vorhaben ab.
            Welchen Vorteil soll es denn haben, das ganze über eine Helper-Klasse zu leiten? Du hast nichts als prüfenden und ausführenden Overhead, der zusätzlich keinen Vorteil schafft, sondern eigentlich nur Verwirrung.
            Ich kenne auch niemanden, der so verfährt, was ein zwei Schlussfolgerungen zulässt: Du bist ein Genie oder auf dem Holzweg! Nicht bös gemeint - nur ein Tipp!

            Weiterer Lesestoff hier:
            http://de.wikipedia.org/wiki/Abstrakte_Fabrik
            http://de.wikipedia.org/wiki/Erzeugungsmuster
            http://de3.php.net/manual/de/languag...interfaces.php

            Kommentar


            • #7
              Da ich es unbedingt ausprobieren wollte, habe ich es sogar geschafft mit Hilfe von _call und call_user_func_array innerhalb der helper Klasse eine Methode zu basteln, die mir den Zugriff auf die anderen Methoden erlaubt. Das Hauptproblem dabei war und ist die jeweilige Klasse anzusprechen. Ich konnte das nur mit einem Array lösen, dass alle Methoden der jeweilgen Klasse sammelt und jeweils über __call und die Methode mir die zugehörige Klasse aus dem Array sucht. Nicht gerade schön.

              Die Idee war so etwas wie Unterklassen zu bilden, diese Unterklassen aus Datei auszulagern und über ein Objekt jeweils auf die Klassen zugreifen zu können. Das hat für mich den Vorteil, dass ich nicht zig Objekte sondern nur eins habe, wobei ich zusätzlich festlegen kann, welche Klasse ich laden möchte oder nicht. Weiterhin können so sehr einfach neue Pakete hinzugefügt werden und die einzelnen Klassen lassen sich thematisch etc. ordnen. Ob nun Holzweg oder Genie, für so blöde halte ich die Idee an sich nicht. Scheinbar scheint es so etwas auch zu geben, aber mit diesen Fabriken komme ich noch nicht wirklich klar. Da fehlt mir einfach die Erfahrung, bin doch erst seit einer Woche im PHP Rausch. Wenn ich dann noch einen Blick in die Reflections werfe falle ich fast hinten über.

              Kommentar


              • #8
                Hallo ecomeback,

                ich rate dir dein Vorhaben zu verwerfen und das über die hier bereits genannten Pattern (insbesondere das Factory-Pattern) zu realisieren. Das bringt zum einen eine bessere Lesbarkeit in deine Scripten, zum anderen hälst du dich damit an de facto Standards, die schon 1000 Mal erprobt sind.
                Viele Grüße,
                Dr.E.

                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                1. Think about software design [B]before[/B] you start to write code!
                2. Discuss and review it together with [B]experts[/B]!
                3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                4. Write [I][B]clean and reusable[/B][/I] software only!
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                Kommentar

                Lädt...
                X