2017-05-05 185 views
0

我正在写一个亚马逊MWS脚本,需要包含多个PHP文件并运行包含在这些文件中的函数。如何在一个PHP脚本中包含和调用多个函数?

每个函数都可以从各自的PHP文件中运行,但只运行第一个函数。第二个函数,无论我使用什么顺序,都会引发关于我通过它的参数的致命错误。

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

这里是前两个函数我试图运行:

// 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; 
} 

echo print_r($request)声明表明我$request确实是一个关联数组。我想也许错误是由冲突变量引起的(每个函数使用$ request和$ service),所以我尝试在调用它们之间使用unset()

+0

如果'$ request'是一个关联数组,则不能调用类似'$ request-> setNextToken()'的方法。这需要'$ request'作为一个对象。但是你'unset($ request)',那么'$ request'怎么设置为任何东西呢? – Barmar

+0

@Barmar:在'require_once'运行的文件中创建'$ request'。但你说得对,'$ request'是一个对象。也许这就是我的问题所在。它是一个包含多个关联数组的对象。它应该是一个数组数组吗? –

回答

1

请勿在while循环中使用require_once。它只在循环中第一次执行该文件。第二次,它意识到该文件已被执行,所以它不会再执行一次。改为使用require

对于需要重复执行的代码,使用包含文件是非常不寻常的设计。通常,您只需在包含文件中定义函数,或者使用它们来初始化全局变量(例如数据库参数)。所以正常的方法是在包含文件中定义一个函数,然后每次通过循环调用该函数,而不是将文件包含在循环中。

+0

对不起,我想我的问题还不清楚。我多次使用require_once()来初始化多个文件。正如我从输出中看到的,该文件当然正在执行中。 @vonOak:好点。我做了改变。 –

+0

我在'while'循环中讨论'require_once'。它只通过循环执行第一次。 – Barmar

+0

哦,我明白了。你是对的。我把它移出循环。谢谢。 –

相关问题