如何在nusoap中通过引用设置参数?

时间:2012-06-02 13:53:57

标签: php nusoap ref

如何在nusoap中通过ref设置参数。在下面的代码中,我应该通过ref(status和recId)设置两个参数。请注意&无效:

        $params = array(
        'username' => GATEWAY_USERNAME,
        'password' => GATEWAY_PASSWORD,
        'from' => GATEWAY_NUMBER,
        'to' => array($to),
        'text' => $message,
        'flash' => $flash,
        'udh' => '',
        'status' => &$status,
        'recId' => &$recId
    );

    $sendParams=array($params);
    $res=$this->client->call('Send',$sendParams);

2 个答案:

答案 0 :(得分:2)

关于通过引用传递值:

function test_reference_in(&$array) {
    $array['a'] = 2;
}

$test_array['a'] = 1;
test_reference_in($test_array);
echo $test_array; //-> it prints 2

关于nusoap:

现在在nusoap中,客户端类为nusoap_client 在那个班级中你有nusoap_client::call()来拨打肥皂。

这就是nusoap_client::call()对数组$params的appen,即你的$sendParams示例。
我将省略与$params无关的所有其余方法,以更好地解释发生了什么。

/**
 * Pseudocode of call to explain the operations on $params
 * @see nusoap_client::call()
 */
function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){
    /*
       some code 
       .
       .
       .

     */
    // varDump is just var_dump so print $params 
    $this->appendDebug('params=' . $this->varDump($params));
     /*
       some code 
       .
       .
       .

     */ 

    /*
     * Here $params has been read, no write operation in there 
     * about serializeRPCParameters @see class.wsdl.php again is just reading
     */
    if (is_string($params)) {
        $this->debug("serializing param string for WSDL operation $operation");
        $payload = $params;
    } elseif (is_array($params)) {
        $this->debug("serializing param array for WSDL operation $operation");
        $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType);
    } else {
        $this->debug('params must be array or string');
        $this->setError('params must be array or string');
        return false;
    }

    /*
     * Here again $params has been read, no write operation in there 
     */
    if (is_string($params)) {
        $this->debug("serializing param string for operation $operation");
        $payload = $params;
    } elseif (is_array($params)) {
        $this->debug("serializing param array for operation $operation");
        foreach($params as $k => $v){
            $payload .= $this->serialize_val($v,$k,false,false,false,false,$use);
        }
    } else {
        $this->debug('params must be array or string');
        $this->setError('params must be array or string');
        return false;
    }
}   

所以你可以看到这里通过引用传递$ params没有任何好处。

由于:

  1. $ params未在nusoap_client :: call()
  2. 中以任何方式修改
  3. 即使你必须再次使用nosoap_client :: call()
  4. 之后在其他地方修改$ params

    如果你想在任何情况下通过引用传递$ params怎么办?我能这样做吗?

    嗯,是的,你可以! 要实现这一点,您必须复制nusoap_client.php并将其称为nusoap_client_new.php 在那里,将班级名称格式nusoap_client修改为nusoap_client_new

    // From this 
    class nusoap_client extends nusoap_base  {
    
    // To this 
    class nusoap_client_new extends nusoap_base  {
    

    修改nusoap_client_new::call()方法,在这样的参数中添加ref:

    /*
     * Please note &$params=array() instead of $params=array()
     */
    function call($operation,&$params = array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){
        /**
         * Of course here you have to modify your code to make some operation on $params
         * according to your needs.
         */
         /*
           original code 
           .
           .
           .
    
         */ 
    }
    

    最后更新您的代码以使用nusoap_client_new::call()代替nusoap_client::call()

答案 1 :(得分:1)

特别为古斯塔沃。

PHP 5.4的版本开始:

  

已删除通过引用传递的呼叫时间。

这是什么意思,在版本<= PHP 5.3这样的代码中应该有效:

function appendA($string) {
    $stringA .= 'A';
}

$string = '';
appendA(&$string);

但以后不再工作了。对于PHP 5.4+来创建一个通过引用编辑其参数的函数,你必须从这个开始以这种方式声明它。例如:

function appendA(&$string) { // <- first change
    $stringA .= 'A';
}

$string = '';
appendA($string); // <- second change

请注意,使用PHP 5.4+时,尝试使用appendA(&$string)调用函数将产生通知,而不是通过引用更改值。

根据原始问题,我找不到$params在nusoap client::call()函数期间发生变化的地方,所以我认为没有必要通过引用提供它们,但我可能会失明。无论如何,声明的方法都没有与PHP 5.4+兼容,因此在方法调用期间& near参数将不适用于那些PHP版本。在这种情况下需要修改方法。