【问题标题】:How do you include and call multiple functions in one PHP script?如何在一个 PHP 脚本中包含和调用多个函数?
【发布时间】:2017-05-05 15:19:48
【问题描述】:

我正在编写一个亚马逊 MWS 脚本,该脚本需要包含多个 PHP 文件并运行这些文件中包含的函数。

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

致命错误: 未捕获的异常“异常”,消息“无法从提供的数据构造”。请务必传递关联数组或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()

【问题讨论】:

  • 如果$request是关联数组,则不能调用$request->setNextToken()之类的方法。这要求$request 是一个对象。但是你做了unset($request),那么$request 是怎么设置的呢?
  • @Barmar:$request 是在require_once 运行的文件中创建的。但你是对的,$request 是一个对象。也许这就是我的问题所在。它是一个包含多个关联数组的对象。它应该是一个数组数组吗?

标签: php amazon amazon-mws


【解决方案1】:

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

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

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

【讨论】:

  • 对不起,我想我的问题不清楚。我多次使用require_once() 来初始化多个文件。正如我从输出中看到的那样,该文件肯定正在执行。 @vonOak:好点。我做出了改变。
  • 我说的是while 循环中的require_once。它只在循环中第一次执行。
  • 哦,我明白了。是的,你是对的。我把它移出了循环。谢谢。
  • 不是每次循环都要分配一个新的$request吗?
  • 我只是猜测,因为您还没有显示文件的作用。
猜你喜欢
  • 2018-08-07
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
相关资源
最近更新 更多