Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个PHP脚本中包含和调用多个函数?_Php_Amazon_Amazon Mws - Fatal编程技术网

如何在一个PHP脚本中包含和调用多个函数?

如何在一个PHP脚本中包含和调用多个函数?,php,amazon,amazon-mws,Php,Amazon,Amazon Mws,我正在编写一个AmazonMWS脚本,它需要包含多个PHP文件并运行这些文件中包含的函数 每个函数在各自的PHP文件中运行良好,但只有第一个函数运行。第二个函数,不管我使用什么顺序,都会抛出一个关于我正在传递的参数的致命错误 致命错误:未捕获异常“exception”,消息为“无法从提供的数据构造”。请确保传递关联数组或DomeElement' 以下是我尝试运行的前两个函数: // Initialize and run ListInboundShipments. require_once 'Li

我正在编写一个AmazonMWS脚本,它需要包含多个PHP文件并运行这些文件中包含的函数

每个函数在各自的PHP文件中运行良好,但只有第一个函数运行。第二个函数,不管我使用什么顺序,都会抛出一个关于我正在传递的参数的致命错误

致命错误:未捕获异常“exception”,消息为“无法从提供的数据构造”。请确保传递关联数组或DomeElement'

以下是我尝试运行的前两个函数:

// 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。

不要在while循环中使用require\u一次。它仅在第一次通过循环执行文件。第二次,它意识到该文件已经执行,因此不再执行它。使用require代替


对需要像这样重复执行的代码使用include文件是一种不同寻常的设计。通常,您只需在include文件中定义函数,或使用它们初始化全局变量,例如数据库参数。因此,通常的方法是在include文件中定义一个函数,然后每次通过循环调用该函数,而不是在循环中包含该文件。

如果$request是关联数组,则不能调用$request->setNextToken这样的方法。这需要$request作为对象。但是您没有取消设置$request,那么$request是如何设置的呢?@Barmar:$request是在require_运行的文件中创建的。但您是对的,$request是一个对象。也许这就是我的问题所在。它是一个包含多个关联数组的对象。应该是数组吗?对不起,我想我的问题不清楚。我多次使用require_初始化多个文件。正如我从输出中看到的,文件肯定正在执行中@沃诺克:说得好。我做了改变。我说的是while循环中的require_。它只在循环中第一次执行。哦,我明白了。是的,你说得对。我把它移出了循环。谢谢。它不是每次通过循环都需要分配一个新的$request吗?我只是猜测,因为您还没有显示文件的功能。
while ($token != null) {
    require '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;
}