2017-05-05 1 views
0

Ich schreibe ein Amazon MWS-Skript, das mehrere PHP-Dateien enthalten und Funktionen ausführen muss, die in diesen Dateien enthalten sind.Wie können Sie mehrere Funktionen in einem PHP-Skript einschließen und aufrufen?

Jede Funktion läuft gut aus ihrer eigenen PHP-Datei, aber nur die erste Funktion läuft. Die zweite Funktion, egal in welcher Reihenfolge, gibt einen Fatal Error über die Parameter aus, die ich durchführe.

Fatal error: Uncaught exception 'Exception' with message 'Unable to construct from provided data. Please be sure to pass associative array or DOMElement'

Hier sind die ersten beiden Funktionen, die ich zu laufen versuche:

// Initialize and run ListInboundShipments. 
require_once 'ListInboundShipments.php'; 
// Set status array and timeframe criteria for filtering shipments 
$shipmentStatusList = new FBAInboundServiceMWS_Model_ShipmentStatusList(); 
$shipmentStatusList->setMember(array('WORKING','SHIPPED','IN_TRANSIT','DELIVERED','CHECKED_IN','RECEIVING','CLOSED','CANCELLED','DELETED','ERROR')); 
$updatedAfter = date('Y-m-d', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); 
$updatedBefore = date('Y-m-d'); 

// Pass filter criteria into $request array 
$request->setShipmentStatusList($shipmentStatusList); 
$request->setLastUpdatedAfter($updatedAfter); 
$request->setLastUpdatedBefore($updatedBefore); 

// Create XML document of shipments. 
$shipmentXML = invokeListInboundShipments($service, $request); 

// Parse the new XML document. 
$shipments = new SimpleXMLElement($shipmentXML); 
$shipmentArray = array(); 
foreach ($shipments->ListInboundShipmentsResult->ShipmentData->member as $member) { 
    // Create array of all shipments. 
    $shipmentArray[] = array(
     "ShipmentId"=>$member->ShipmentId, 
     "ShipmentStatus"=>$member->ShipmentStatus 
    ); 
} 

// Destroy variables to get a clean slate. 
unset($service); unset($request); 

// Save token and run through ListInboundShipmentsByNextToken until 
// it does not return a token. 
$token = (string)$shipments->ListInboundShipmentsResult->NextToken; 
while ($token != null) { 
    require_once 'ListInboundShipmentsByNextToken.php'; 
    $request->setNextToken($token); 
    echo print_r($request); 

    // Create new XML document. 
    $shipmentXML = invokeListInboundShipmentsByNextToken($service, $request); 
    $shipments = new SimpleXMLElement($shipmentXML); 

    // Use XML document to create array of all shipments. 
    foreach ($shipments->ListInboundShipmentsResult->ShipmentData->member as $member) { 
     $shipmentArray[] = array(
      "ShipmentId"=>$member->ShipmentId, 
      "ShipmentStatus"=>$member->ShipmentStatus 
     ); 
    } 
    $token = $shipments->ListInboundShipmentsResult->NextToken; 
} 

Die echo print_r($request) Aussage zeigt mir, dass $request in der Tat ein assoziatives Array ist. Ich dachte, dass der Fehler möglicherweise durch widersprüchliche Variablen verursacht wurde (jede Funktion verwendet $ request und $ service), also habe ich versucht, sie zwischen unset() aufzurufen.

+0

Wenn '$ request' ein assoziatives Array ist, können Sie keine Methoden wie' $ request-> setNextToken() 'aufrufen. Das erfordert $ request, um ein Objekt zu sein. Aber du hast 'unset ($ request)' 'gemacht, also wie ist' $ request' überhaupt gesetzt? – Barmar

+0

@Barmar: '$ request' wird in den Dateien erstellt, die von' require_once' ausgeführt werden. Aber Sie haben recht, dass '$ request' ein Objekt ist. Vielleicht liegt das an meinem Problem. Es ist ein Objekt, das mehrere assoziative Arrays enthält. Sollte es stattdessen ein Array von Arrays sein? –

Antwort

1

Verwenden Sie nicht require_once in der while Schleife. Es führt die Datei nur das erste Mal durch die Schleife aus. Beim zweiten Mal stellt es fest, dass die Datei bereits ausgeführt wurde, sodass sie nicht erneut ausgeführt wird. Verwenden Sie stattdessen require.

Die Verwendung einer Include-Datei für Code, der wiederholt ausgeführt werden muss, ist ein ungewöhnliches Design. Normalerweise definieren Sie nur Funktionen in Include-Dateien oder verwenden sie zum Initialisieren globaler Variablen (z. B. Datenbankparameter). Der normale Weg wäre also, eine Funktion in der Include-Datei zu definieren und diese Funktion dann jedes Mal durch die Schleife aufzurufen, anstatt die Datei in die Schleife aufzunehmen.

+0

Entschuldigung, ich denke meine Frage war unklar. Ich benutze 'require_once()' mehrmals, um mehrere Dateien zu initialisieren. Die Datei wird sicherlich ausgeführt, wie ich aus der Ausgabe sehen kann. @vonOak: Guter Punkt. Ich habe die Änderung vorgenommen. –

+0

Ich spreche von der 'require_once' in der' while' Schleife. Es führt nur das erste Mal durch die Schleife aus. – Barmar

+0

Oh, ich verstehe. Ja, du hast recht. Ich habe es aus der Schleife geschafft. Vielen Dank. –

Verwandte Themen