php类和方法异常

时间:2014-08-31 23:45:38

标签: php arrays

以下是公共功能“应该使用验证创建虚拟机”,

public function deployVirtualMachine($serviceOfferingId, $templateId, $zoneId, $account = "", $diskOfferingId = "") {

        if (empty($serviceOfferingId)) {
            throw new CloudStackClientException(sprintf(MISSING_ARGUMENT_MSG, "serviceOfferingId"), MISSING_ARGUMENT);
        }

        if (empty($templateId)) {
            throw new CloudStackClientException(sprintf(MISSING_ARGUMENT_MSG, "templateId"), MISSING_ARGUMENT);
        }

        if (empty($zoneId)) {
            throw new CloudStackClientException(sprintf(MISSING_ARGUMENT_MSG, "zoneId"), MISSING_ARGUMENT);
        }

        return $this->request("deployVirtualMachine", array(
            'serviceofferingid' => $serviceOfferingId,
            'templateid' => $templateId,
            'zoneid' => $zoneId,
            'account' => $account,
            'diskofferingid' => $diskOfferingId,
            'displayname' => $displayName,
    }

我正在尝试调用此函数,但我一直遇到异常“$ templateId”缺失。但我很确定它在我的数组中定义了。

  $params = array(

           $serviceOfferingId => '85d06496-bb75-41fb-9358-4ab919e03fe4',
            $templateId => 'c0989cf6-2da5-11e4-a846-726c7bbb864f',
           $zoneId => '7cd483ab-5aad-458b-b5e1-0e270310f41c',
           $name => 'srv11'
 );


echo $cloudstack->deployVirtualMachine($params);

任何帮助都将受到高度赞赏

谢谢

3 个答案:

答案 0 :(得分:1)

你只传递了一个参数,一个数组。

请改为尝试:

$cloudstack->deployVirtualMachine('85d06496-bb75-41fb-9358-4ab919e03fe4', 'c0989cf6-2da5-11e4-a846-726c7bbb864f', '7cd483ab-5aad-458b-b5e1-0e270310f41c', 'srv11');

您的方法需要5个参数(3个必须参数,2个可选参数)。 $params正在收到$serviceOfferingId

单独传递值,或更改方法的签名以接受单个参数。

例如:

public function deployVirtualMachine($params) {

    if (!isset($params['serviceOfferingId'])) {
        throw new CloudStackClientException(sprintf(MISSING_ARGUMENT_MSG, "serviceOfferingId"), MISSING_ARGUMENT);
    }

    // etc...
}

还有一件事,通过使用$serviceOfferingId作为数组键,您说密钥应该是变量$serviceOfferingId的值。这似乎不是你想要的。改用字符串; 'serviceOfferingId'

$serviceOfferingId = 'foo';

$params = array(
    $serviceOfferingId => 'bar'
);

产地:

Array
(
    [foo] => bar
)

你想要的是:

$params = array(
    'serviceOfferingId' => 'bar'
);

哪会产生:

Array
(
    [serviceOfferingId] => bar
)

答案 1 :(得分:1)

你的方法需要5个类型为string的单个参数,在方法调用中你传递一个类型为array的参数 - 你期望什么?

这样称呼:

 echo $cloudstack->deployVirtualMachine('85d06496-bb75-41fb-9358-4ab919e03fe4',
           'c0989cf6-2da5-11e4-a846-726c7bbb864f',
               '7cd483ab-5aad-458b-b5e1-0e270310f41c',
                  null,
                   'srv11' );

答案 2 :(得分:1)

另一个更奇怪的解决方案是将数组$params传递给closure

      public $deployVirtualMachine = function ()
      {
          ....

Params Array(根据Aymans的回答)

      $serviceOfferingId = 0,
      $templateId = 1;
      $zoneId = 2;
      $name = 3;

      $params = array(
        $serviceOfferingId => '85d06496-bb75-41fb-9358-4ab919e03fe4',
        $templateId => 'c0989cf6-2da5-11e4-a846-726c7bbb864f',
        $zoneId => '7cd483ab-5aad-458b-b5e1-0e270310f41c',
        $name => 'srv11'
      );

然后:

      call_user_func_array ( 'deployVirtualMachine ', $params );

这将传递数组,但呈现为或多或少不可读的代码:/