2016-03-24 5 views
-1

Ich arbeite an einer Art von einer Bibliothek, die Requests Bibliothek verwendet. Ich bekomme einen Fehler im Titel. Ich tue folgendes:Klasse kann nicht redeclariert Anfragen

function __autoload($class_name) { 
     include 'vendor/rmccue/requests/library/Requests.php'; 
     $class_file = $class_name.'.php'; 
     print $class_file; 
     if(file_exists($class_file)) { 
      include $class_file; 
     } else { 
      throw new Exception("Unable to load $class_name.<br>.<br>.<br>"); 
     } 
    } 
$session = new Session($instanceID,$profileID,$routerID,$api_endpoint,$headers); 
    $session->createSession(); 

Seit Requests wird in mehreren Klassen verwendet werden, ich will einmal laden. Wie kann ich es tun?

Session.php

class Session 
{ 
    private $instanceID = null; 
    private $profileID = null; 
    private $routerID = null; 
    private $apiEndpoint = null; 
    private $headers = null; 

    public function __construct($instance_id,$profile_id,$router_id,$api_endpoint,$headers) 
    { 
     $this->instanceID = $instance_id; 
     $this->profileID = $profile_id; 
     $this->routerID = $router_id; 
     $this->apiEndpoint = $api_endpoint; 
     $this->headers = $headers; 
    } 

    public function createSession() 
    { 
     $create_session_url = $this->apiEndpoint.'createSession?{"accountID":"39BB2F17-89D6-2093-B133-76C21D513EDF"}'; 
     $create_session_url = 'https://api.xx.cc/api/index.php/smartcall/createSession?{%22accountID%22:%2239BB2F17-89D6-2093-B133-76C21D513EDF%22}'; 
     $request = \Requests::get($create_session_url, $this->headers); 
     var_dump($request->body); 
    } 

} 

Update # 1 dies nun tun Ich sagte ich: Class Session nicht gefunden:

include 'vendor/rmccue/requests/library/Requests.php'; 
    \Requests::register_autoloader(); 

    function __autoload($class_name) { 

     $class_file = $class_name.'.php'; 
     if ($class_file != 'Requests.php') { 
      print $class_file; 
      if(file_exists($class_file)) { 
       include_once $class_file; 
      } else { 
       throw new Exception("Unable to load $class_name.<br>.<br>.<br>"); 
      } 
     } 

    } 

$session = new Session($instanceID,$profileID,$routerID,$api_endpoint,$headers); 
    $session->createSession(); 
+0

Der Fehler tritt becuase 'Request.php' ist bereits enthalten oder woanders erforderlich, überprüfen Sie zuvor Dateien enthalten – Fabio

+0

Nein es sonst nirgendwo ist, gibt es keine Neudeklaration der Antrag Klasse ist und der Code, den ich hier gab, ist die einzige Berufung Klasse – Volatil3

+0

Dies ist, was der Fehler sagt – Fabio

Antwort

1

Verwenden include_once statt include.

include_once kann in Fällen verwendet werden, wo die gleiche Datei enthalten sein können und während einer bestimmten Ausführung eines Skripts mehr als einmal ausgewertet, so dass in diesem Fall kann es wie Funktion Neudefinitionen, Variablenwert Neuzuordnungen Vermeidung von Problemen helfen, usw.

die Dokumentation finden Sie hier: include_once()

+0

Frage aktualisiert. – Volatil3

0

Jedes Mal, wenn eine Klasse auto-enthalten ist, versuchen Sie Ihre Bibliothek aufnehmen:

function __autoload($class_name) { 
    include 'vendor/rmccue/requests/library/Requests.php'; 

Mit include_once würde wahrscheinlich das lösen, aber in der Realität sollte der automatische Lader konfiguriert werden, um automatisch Request zu laden, auch wenn es benötigt wird.

Also sollten Sie nicht die Bibliothek in Ihre Auto-Lade-Funktion enthalten, haben Sie Ihre Auto-Lade-Funktion behandeln alle Klassen.

+0

pls check updated Frage – Volatil3

+0

Also sollte ich nicht 'autoload' und prüfen, ob die Datei nicht' Request.php' ist, wenn ja dann laden sonst ignorieren? – Volatil3

0

Ok also spl_autoload_register war die Antwort. Das Problem trat auf, weil mein Code eine __autolod und spl_autoload_register (innerhalb der Bibliothek) hatte.

Vom manual:

Wenn Ihr Code hat eine bestehende __autoload() Funktion dann diese Funktion muss explizit auf der __autoload Warteschlange registriert werden. Dies liegt daran, spl_autoload_register() wird effektiv ersetzen den Engine-Cache für die __autoload() -Funktion entweder von spl_autoload() oder spl_autoload_call().

Ich habe folgende Änderungen in call.php:

include_once 'vendor/rmccue/requests/library/Requests.php'; 
\Requests::register_autoloader(); 

und geändert __autoload() auf einfache Funktionsnamen, zB: autoload und nannte es in spl_autoload_register().Code unten angegeben:

function autoload($class_name) { 

     $class_file = $class_name.'.php'; 
     if ($class_file != 'Requests.php') 
     { 
      if(file_exists($class_file)) { 
       include_once $class_file; 
      } else { 
       throw new Exception("Unable to load $class_name.<br>.<br>.<br>"); 
      } 
     } 

    } 
    spl_autoload_register('autoload'); 

Da alle Klassen über spl_autoload_register daher die Warteschlange gestellt werden, es gibt keinen Konflikt. Ich kann einfach Request anrufen und die kann meine eigenen Klassen verwenden.