Bug #80895 [Opn->Fbk]: Unexpected XML due to memory optimization in SOAP

From: Date: Wed, 24 Mar 2021 11:42:55 +0000
Subject: Bug #80895 [Opn->Fbk]: Unexpected XML due to memory optimization in SOAP
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-232961@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80895&edit=1

 ID:                 80895
 Updated by:         cmb@php.net
 Reported by:        vasilevrvv at gmail dot com
 Summary:             Unexpected XML due to memory optimization in SOAP
-Status:             Open
+Status:             Feedback
 Type:               Bug
 Package:            SOAP related
 Operating System:   Linux
 PHP Version:        8.0.3
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

Copy on write and references are different concepts.  While the
former is transparent (aka "magic"), the latter is not, and it
seems to me that $returnAddressee contains references.  You can
verify that with

    var_dump($returnAddresse);

Cf. <https://3v4l.org/iaqnA>


Previous Comments:
------------------------------------------------------------------------
[2021-03-22 18:28:48] vasilevrvv at gmail dot com

Description:
------------
The problem is that when copying an array (not in pass by reference case), ref elements are created
in XML.

!!! This is due to memory optimization in PHP, since in fact the array is copied only when it
changes !!!

We get unexpected results:

The problem is solved by adding the line

$returnAddressee['address'] = $returnAddressee['address'];

as first cycle line.

At this point, the actual copying of the data took place. Reference was broken.

After add we get correct result.

This is unexpected behavior. Behavior should not depend on the internal "magic" of the
PHP, it should be logical. Either always pass the same data by reference, or if the data would have
been explicitly passed by reference (perfectably)

Test script:
---------------
private function test(Request\Shipment $shipment, array $returnAddressee): array
{
    $items = [];
    foreach ($shipment->parcels as $k => $parcel) {
        $items[] = array(
        'receiverAddressee' =>
$this->createReceiverAddressee($shipment->consignee),
        'returnAddressee' => $returnAddressee
        );
    }
    
    return $items;
}

Unfortunately, I cannot give a complete script for testing, since it depends on the WSDL service.

Expected result:
----------------
<item_list>
    <item service="CA">
        <receiverAddressee>
            <address postcode="13240" deliverypoint="La Solana"
country="RU"
                street="Calle Empedrada 45" />
        </receiverAddressee>
        <returnAddressee>
            <address postcode="123123" deliverypoint="Test"
country="EE" street="Test 22" />
        </returnAddressee>
    </item>
    <item service="CA">
        <receiverAddressee>
            <address postcode="13240" deliverypoint="La Solana"
country="RU"
                street="Calle Empedrada 45" />
        </receiverAddressee>
        <returnAddressee>
            <address postcode="123123" deliverypoint="Test"
country="EE" street="Test 22" />
        </returnAddressee>
    </item>
</item_list>

Actual result:
--------------
<item_list>
    <item service="CA">
        <receiverAddressee>
            <address postcode="13240" deliverypoint="La Solana"
country="RU"
                street="Calle Empedrada 45" />
        </receiverAddressee>
        <returnAddressee>
            <address postcode="123123" deliverypoint="Test"
country="EE" street="Test 22"
                id="ref1" />
        </returnAddressee>
    </item>
    <item service="CA">
        <receiverAddressee>
            <address postcode="13240" deliverypoint="La Solana"
country="RU"
                street="Calle Empedrada 45" />
        </receiverAddressee>
        <returnAddressee>
            <address href="#ref1" />
        </returnAddressee>
    </item>
</item_list>


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=80895&edit=1


Thread (13 messages)

« previous php.bugs (#232961) next »