Include mit selben Funktionsnamen

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

  • Include mit selben Funktionsnamen

    Guten Tag,

    ich hab folgendes Problem. Ein system gebaut, welches mittels plugins erweiterbar ist. Wenn ich jetzt einen neuen User anlege, sollen Sprachdefinitionen, welche in einer Funktion innerhalb des Plugins liegen, in eine Mysql Datenbank geschoben werden.

    Versuch:

    PHP-Code:
    $sql="Select datei_name from plugins"
    $result=mysql_query($sql);
    while (
    $daten=mysql_fetch_row($result))
    {
    include(
    "$daten[0]");
    init_language();

    Die Funktion init_language liegt innerhalb des plugins, und übernimmt das ganze reinschreiben in die DB etc.

    Nun kommt da aber der Fehler, cannot redeclare init_language()
    was meines wissens daher rührt, das eine Funktion mit dem Namen schon vorhanden ist.

    Gibt es eine Mgl. Eine datei wieder zu entladen(exclude()) vielleicht?

    danke für jede Hilfe

    PS: Mal ne Frage komplett Off-Topic. Bei mir geht die Forensuche nicht, ich bekomme immer keine Treffer. Woran kann das liegen?

    mfg Martin
    Evtl. Rechtschreibfehler sind beabsichtigt und dienen der Belustigung des Lesers

  • #2
    probier mal das:

    PHP-Code:
    $sql="Select datei_name from plugins"
    $result=mysql_query($sql);
    while (
    $daten=mysql_fetch_row($result))
    {
    require_once(
    "$daten[0]");
    init_language();

    Kommentar


    • #3
      Geht nich

      Habs jetzt eingebaut, sorry ging nich eher. ich poste mal auf das script, mal schauen, ob ihr den Fehler findet. Php müsste sowas wie eine unload funktion haben, oder?

      PHP-Code:
      //Die Sprachdefinitionen aller Inputplugins mit demselben oder einem niedrigeren Rechtelevel müssen
      //hier eingetragen werden, ebenso das edit plugin
      include_once($default['file_root'].'/plugin/edit.plug.php');
      $language_string=default_language_set ();
      //Für Die Standartsprache anlegen
                      
      $sql_i 'INSERT INTO `language_plugin` (`mid` , `lid` , `pid` , `content` ) ';
                      
      $sql_i .= 'VALUES (\''.$insert_id.'\', \''.$_POST['modul_language'].'\', \'ed\', \''.$language_string.'\' )'
                      
      $result_i=mysql_query($sql_i)
                          or die (
      mysql_errno()."Fehler".mysql_error());

      //Die anderen inpputplugins mit dem  Rechtelevel anlegen
      $sql='Select `id`,`datei` from `plugin` where `typ`=\'input\' and `rechtelevel`<=\''.$_POST['rechtelevel'].'\'';
      print 
      $sql;
      $result=mysql_query($sql)
          or die (
      mail_error(mysql_errno().':'.mysql_error()."\n\n".'Zeile:48'));
      while (
      $daten=mysql_fetch_row($result))
      {
          include_once(
      $default['file_root'].'/plugin/'.$daten[1]);
          
      $language_string=default_language_set ();
          
      //Für Die Standartsprache anlegen
                          
      $sql_i 'INSERT INTO `language_plugin` (`mid` , `lid` , `pid` , `content` ) ';
                          
      $sql_i .= 'VALUES (\''.$insert_id.'\', \''.$_POST['modul_language'].'\', \''.$daten[0].'\', \''.$language_string.'\' )'
                          
      $result_i=mysql_query($sql_i)
                              or die (
      mail_error(mysql_errno().':'.mysql_error()."\n\n".'Zeile:58'));

      der macht hier in dem forum ein paar \ weg, der code ist aber alles i.O.

      danke für eure hilfe

      mfg Martin
      Evtl. Rechtschreibfehler sind beabsichtigt und dienen der Belustigung des Lesers

      Kommentar


      • #4
        Zusammengefasst

        Ich habe das Problem mal auf ganz winzig wenig zeilen gepackt, weil weder googeln noch anderes geholfen hat.

        PHP-Code:
        <?
        //Die Index.php, diese seite wird aufgerufen
        require_once(inc1.php);
        test();
        require_once(inc2.php);
        test();
        //ENDE
        ?>

        <?
        //Die inc1.php
        function test()
        {
        print 'test1';
        }
        //ENDE
        ?>

        <?
        //Die inc2.php
        function test()
        {
        print 'test2';
        }
        //ENDE
        ?>
        Was ich gerne hätte wäre folgende Ausgabe:
        test1
        test2

        was ich bekomme:
        Code:
        test1
        Fatal error: Cannot redeclare test() (previously declared in C:\SERVER\www\newssystem_test\inc1.php:4) in C:\SERVER\www\newssystem_test\inc2.php on line 2
        Evtl. Rechtschreibfehler sind beabsichtigt und dienen der Belustigung des Lesers

        Kommentar


        • #5
          Hmm. Ein "uninclude" gibt es nicht und lässt sich soweit ich denken kann auch nicht nachbauen. Würde auch keinen Sinn machen, für PHP sieht es schließlich so aus, als würdest Du im selben Quelltext eine Funktion zweimal definieren. Als Workaround würd ich Klassen vorschlagen, d.h. jedes Plugin wird als Objekt eingebunden, also

          $plugin1->test(); // können problemlos
          $plugin2->test(); // koexistieren

          Nun hast Du vielleicht den Fall, dass Benutzer zwei Module für die gleiche Funktion einreichen, also sagen wir das Versenden von Mails. Dann musst Du einen Standardhandler festlegen, also welches Plugin für das Versenden von Mails zuständig ist. Sowas in der Art müsstest Du eh irgendwann anlegen, sonst kommst Du in Teufels Küche: Mailvorbereitung durch fkt. in Modul 1, Mailversand durch fkt. in Modul 2....

          $mailhandler = $plugin2;
          $mailhandler->test();

          Kommentar


          • #6
            normalerweise isses so, dass jemand der quelltext sieht davon ausgeht, dass ein aufruf der funktion test immer genau das selbe macht

            wenn du unterschiedliche aktionen ausführen willst, dann nenn die funktionen auch unterschiedlich.

            du wirst dir dankbar dafür sein, solltest du deinen code mal durchgehen (später oder wenn was nich so läuft wie's soll)
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              das Überladen von Funktion wird erst ab PHP 5 zur Verfügung stehen. Ansonsten bekommst du eben den Fehler "cannot redeclare...".
              Da bring auch require_once und include_once nix, wenn in den Files dann der selbe Funktionsname vergeben wurde.

              Möglich wäre nur, die Funktionen in Klassen zu stecken, dann können sie auch gleich heissen. Bin mir nicht ganz sicher, aber ich glaube, dass das geht.

              Kommentar


              • #8
                dynamischer Funktionsname

                Guten tag alle zusammen,

                habe mir jetzt eine Lösung zusammengefriemelt, die beim hochladen eines neues Plugins, die standartfunktion test() in z.B.
                $_POST[typ].'_'.$insert_id.'_'.test().


                wie kann ich diese Funktion jetzt wieder aufrufen, sprich wie gestalte ich dynamisch funktionsnamen, ich will die Funktion quasi "input_1_test()" heisst die Funktion, ansprechen will ich das aber über Variablen, wie ich sie erstellt hab sozusagen. Wie mach ich das?

                hab mir überlegt das mit dene geschweiften {} klammern zumachen, werd da aber auch nich schlau draus.

                mfg Martin
                Evtl. Rechtschreibfehler sind beabsichtigt und dienen der Belustigung des Lesers

                Kommentar


                • #9
                  eval();
                  schätze ich

                  Kommentar


                  • #10
                    Lösung

                    Habe eine Lösung gefunden:

                    $funktionsname=$id.'_test_funktion';
                    Aufruf dann über $funktionsname();


                    mfg Martin
                    Evtl. Rechtschreibfehler sind beabsichtigt und dienen der Belustigung des Lesers

                    Kommentar

                    Lädt...
                    X