"Cannot redeclare class" trotz include_once

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

  • "Cannot redeclare class" trotz include_once

    Hallo,
    ich benutze ein CMS-Prozessor(XML Content Verarbeitung) als Framework für mein eigenes CMS (nextCMS, mehr unter http://www.hardcoding.net und http://sourceforge.net/projects/nextcms) und habe ein Problem:

    In diesem CMS gibt es Extensions, Unterklassen der Klasse Extension. z.B. erzeugt der Aufruf in einem Template:

    {ReDirect(type="action" )}

    dass die Funktion getCode($paramList) Klasse ReDirect mit der Variable type=action verarbeitet wird:

    Code:
    <?php
            class ReDirect extends Extension {
                    function getCode($paramList) {
                             #Klasse einbinden
                             if(!$ext) {
                              include strtolower($_POST['ext']).'.php';
                              $ext = new $_POST['ext']();
                             }
    
                             switch($paramList['type']) {
                              case 'action':
                               return $ext->doAction();
                              break;
    
                              case 'url':
                               return $ext->getURL();
                              break;
    
                              case 'text':
                               return $ext->getText();
                              break;
                             }
                    }
            }
    ?>
    Ich habe ein Formular welches als $_POST['ext'] = 'LogIn' übergibt. In der Datei login.php steht folgendes:

    Code:
    <?php
            class LogIn extends Extension {
                    function getCode($paramList) {
                             #LogIn Forumular
                              if(!$_SESSION['UserAccess']) {
                              #Template LogIn einbinden (da nicht verfügbar):
                               $returncode = '
                               <form action="redirect.html" method="post">
                               <b>LogIn Name: </b><input type="text" name="UserName"><br>
                               <b>Passwort: </b><input type="password" name="UserPassword">
                               <input type="hidden" name="ext" value="LogIn"><br>
                               <input type="submit" value="Let me in!">
                               </form>';
                              }
                             #User eingeloggt, Status anzeigen
                              elseif($_SESSION['access']) {
                               $returncode = '
                               <b>'.$_SESSION['UserName'].'</b><br>
                               eingeloggt. <a href="  ">Ausloggen</a>';
                              }
    
                              return $returncode;
                    }
    
                    function doAction() {
                              #Userdaten der Session hinzufügen
                               $_SESSION['UserName'] = $_POST['UserName'];
                               $_SESSION['UserPassword'] = md5($_POST['UserPassword']);
                               unset($_POST['UserName']);
                               unset($_POST['UserPassword']);
                              #tmp
                               $UserName = $_SESSION['UserName'];
                               $UserPassword = $_SESSION['UserPassword'];
                              #DB Verbindung herstellen
                               #Zugangsinformationen laden
                                include 'config.php';
                               #db Klasse laden
                                include 'db.php';
                               #Klasse und Verbindung initieren
                                $db = new db($sqlhost,$sqluser,$sqlpassword,$sqldb);
                               #Query
                                $result=$db->query_first("SELECT UserID FROM users WHERE UserName='$UserName' && UserPassword='$UserPassword'");
                              #Überprüfen
                                if($result['UserID']) {
                                 #Access in Session setzen
                                  $_SESSION['UserAccess'] = true;
                                  return 'okay';
                                }
                    }
    
                    function getURL() {
                              #Gibt die Folge-URL aus
                              #Verbesserung: {this_url}
                               return './';
                    }
    
                    function getText() {
                              #Gibt eine Message aus
                               return 'Vielen Dank '.$_SESSION['UserName'].', sie wurden eingeloggt!';
                    }
    
            }
    ?>
    Also ein Login Forumular übergibt UserName, UserPassword und ext=LogIn an die Seite ReDirect in welcher die Klasse ReDirect mehrmals benutzt wird:

    Code:
    {Session}[B] {ReDirect(type="action" )} [/B] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//DE">
    <html>
    <head>
    <title>{sitetitle} - {title}</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta http-equiv="refresh" content="5;URL=[B] {ReDirect(type="url" )}[/B] ">
    </head>
    
    <body bgcolor="#BBB5AA">
     <table width="100%" height="100%">
      <tr valign="middle" align="center">
       <td><b>[B] {ReDirect(type="text" )}[/B] </b><br>
       <a href="[B] {ReDirect(type="url" )}[/B] ">Falls Sie nicht gleich weitergeleitet werden, klicken Sie bitte hier...</a></td>
      </tr>
     </table>
    </body>
    </html>

    Wenn ich nur den ersten Aufruf im Template "{ReDirect(type="action" )}" habe, funktioniert alles doAction() aus class.LogIn wird ausgeführt. Wenn ich aber mehrere habe kommt der Fehler:

    Fatal error: Cannot redeclare class login in c:\foxserv\www\...\nextcms\extensions\zuendwuerfel\login.php on line 2


    Klar so ein Fehler kommt, wenn man include statt include_once benutzt. Aber in der Klasse welche die Klasse Extension und somit die Extension LogIn aufruft steht ja include_once:

    Code:
                    function loadExtension($name) {
                                    global $document_root, $settings;
    
                                    if (isset($settings->EXTENSIONS[$name]))
                                            $extension = $settings->EXTENSIONS[$name];
    
                                    if (isset($extension)) {
                                            if (!file_exists($this->document_root . $extension)) printError("Die Extension-Datei '$extension' existiert nicht.");
                                            require_once($this->document_root . $extension);
                                            eval("\$ext_instance = new $name(\$this);");
                                            return $ext_instance;
                                    }
                    }

    Ich weiß es hört sich ein wenig kompliziert an, aber vielleicht weiß ja jemand ne Lösung.

    Grüße und thx im Vorraus!

  • #2
    mach doch sone Art Präprozessor Anweisung wie in C drum

    PHP-Code:
    <?php
    if(!isset($_CLASS_EXTENSION_)) {
            
    $_CLASS_EXTENSION_=1;

            class 
    ReDirect extends Extension {
                    function 
    getCode($paramList) {
                             
    #Klasse einbinden
                             
    if(!$ext) {
                              include 
    strtolower($_POST['ext']).'.php';
                              
    $ext = new $_POST['ext']();
                             }

                             switch(
    $paramList['type']) {
                              case 
    'action':
                               return 
    $ext->doAction();
                              break;

                              case 
    'url':
                               return 
    $ext->getURL();
                              break;

                              case 
    'text':
                               return 
    $ext->getText();
                              break;
                             }
                    }
            }
    }
    ?>
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Ja danke, ich hab jetzt ne andere Lösung gefunden:

      PHP-Code:
      <?php

              
      class ReDirect extends Extension {
                      function 
      getCode($paramList) {
                               
      #Klasse einbinden
                               
      if(!$ext) {
                                include 
      strtolower($_POST['ext']).'.php';
                                
      $ext = new $_POST['ext']();
                               }
      ...
      Man muss bei include strtolower($_POST['ext']).'.php'; auch include_once schreiben dann gehts.

      thx

      Kommentar

      Lädt...
      X