Existierende Funktion trotzdem laden



  • Hallo,

    hm. hab mich schon ein wenig im Internet umgeschaut, jedoch nichts passenden gefunden. Und zwar geht es darum, eine bereits (vom Namen) existierende Funktion trotzdem in den Quelltext zu laden. Zb. kann es bei vielen Plugins durchaus vorkommen, dass mal ein name zweimal vorkommt.

    Gibt es nicht irgendwelche möglichkeiten funktionen "abgesichert" zu laden?



  • Ich gehe mal davon aus, dass du von PHP sprichst... 🙄

    Wenn die Funktion bereits im Namespace vorhanden ist, dann kannst du die zweite nicht auch noch reinholen. Das heißt du musst die Funktion umbenennen.

    Oder aber du packst beide (oder eine der beiden) Funktionen in eine statische Klasse-Methode:

    function funktionA()
    {
     echo "GLOBAL::funktionA";
    }
    
    class My
    {
     static function funktionA()
     {
      echo "My::funktionA";
     }
    }
    

    So sind beide Funktionen getrennt, und du kannst die zweite Funktion ähnlich wie mit C++-Namespaces benutzen. 🙂

    funktionA(); // GLOBAL
    
    My::funktionA(); // My "namespace"
    


  • Das funktioniert unter PHP4 auch?



  • Ok. ich bitte den Kommentar zu vernachlässigen.

    aso die möglichkeit ist ansich recht brauchbar. Ih hab wir evt. folgendes system überlegt.

    wenn ich zwei dateien habe, mit jeweil der gleichen function "test_func" - wird eine Random Guid-ID berechnet (wie es zb. bei der Session-ID der Fall ist).

    Aufgrund dieser Guid-Id wird dann die top level class definiert, indem die Datei eingelesen wird, so modifizier wird, dass die funktion eine methode der klasse "Guid-ID" ist.

    Beispiel:

    function test_func()
     {
         echo "Test Funktion";
     }
    

    Beim einlesen wird die Datei "test.func.php" nicht direkt über den Include-Befehl eingelesen sondern erst über einen Buffer.

    Dieser Buffer wird modifiziert, indem der obige Quellcode nun folgendermaßen aussieht.

    class bh74hbjkfjujfhfjhfhjshf
    {
      function test_func()
      {
          echo "Test Funktion";
      }
    }
    

    Dieser "neu" generierte Code wird dann direkt ausgeführt. Voila!!

    Hm, ansich evt. keine schlecht Idee, damit man wirklich nicht an einmalige Functionsnamen gebunden ist.

    Die Frage ist wie schnell man den zweiten Schritt durchführen kann. wobei das auch sehr schnell gemacht ist. Lediglich das beifügen der Klasse.

    Vielleicht gibt noch jemand ein Statement dazu ab.



  • Ich glaube der zweite Schritt in deinem Plan ist nicht all zu zeitaufwendig, was daran liegt, dass PHP ja nunmal eine Scriptsprache ist.

    Wenn es aber um Plugins geht gäbe es vielleicht noch eine andere Lösung (eine simplere zudem). Wenn du ein Plugin einbindest ist es ja ziemlich wahrscheinlich, dass eine Instanz davon erstellt wird. Also kannst du diese schon innerhalb des Plugins erzeugen, und außerdem den Namen des Plugins als globale Variable definieren:

    <?php
    
    /* plugin_a.inc.php */
    
    $PLUGIN_NAME = "Plugin_A";
    
    class CPlugin_A
    {
     function main()
     {
      echo "GLOBAL::Plugin_A::main()<br>";
     }
    }
    
    $Plugin_A = new CPlugin_A();
    
    ?>
    

    Um dann auf das jeweilige Plugin zuzugreifen schreibst du:

    include("plugin_a.inc.php");
    $$PLUGIN_NAME->main();
    

    Natürlich wird $PLUGIN_NAME bei jedem neuen Plugin überschrieben. Du könntest allerdings nach jedem Einbinden des Plugins den Namen zwischenspeichern, zum Beispiel in einem Array. Somit hättest du dann gleich eine Liste der Plugins.

    Nur so eine Idee.


Anmelden zum Antworten