Zur Navigation

An Objekt aus einem Array kommen

1 Horst_Braun

Hallo,

ich arbeite mit der DHL API und erhalte folgendes Ergebnis bei einer print_r Ausgabe
print_r($shipments);
mit PHP:
array
(    [0] => Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment Object
        (
            [sequenceNumber:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 0
            [shipmentNumber:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 123
            [returnShipmentNumber:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 
            [shipmentLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => Testergebnis
            [returnLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 
            [exportLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 
            [codLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private] => 
        )

)
Ich brauche das "Testergebnis". Aber ich finde den korrekten Syntax nicht.

Beide Versionen gehen nicht:
$ergebnis = $shipments[0]->{'shipmentLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment'};

$ergebnis = $shipments[0]->shipmentLabel;

Kann mir bitte jemand helfen?

Vielen Dank.

MfG

31.01.2025 13:53 | geändert: 31.01.2025 14:02

2 Jörg Kruse

Das :private gehört wohl auch noch zum Property-Namen:

$ergebnis = $shipments[0]->{'shipmentLabel:Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment:private'};

31.01.2025 14:09

3 Horst_Braun

Vielen Dank.

Das hatte ich auch schon versucht. Leider bleibt $ergebnis leer.

MfG

31.01.2025 14:13

4 Horst_Braun

Ich habe es noch mit var_export ausgegeben:
var_export($shipments);

Das sieht dann so aus
array (
  0 => 
  Dhl\Sdk\Paket\Bcs\Service\ShipmentService\Shipment::__set_state(array(
     'sequenceNumber' => '0',
     'shipmentNumber' => '123',
     'returnShipmentNumber' => '',
     'shipmentLabel' => 'Testergebnis',
     'returnLabel' => '',
     'exportLabel' => '',
     'codLabel' => '',
  )),
)

31.01.2025 14:36 | geändert: 31.01.2025 14:37

5 Jörg Kruse

Wenn es sich wirklich um private Properties handelt, wie es das :private nahelegt, dann kann wohl nicht direkt darauf zugegriffen werden. Da bräuchte es z.B. eine entsprechende getter Methode, falls vorhanden.

Mit print_r() kann man diese Properties aber dennoch sehen.

Wie hast du dieses Array denn erhalten?

31.01.2025 14:49

6 Horst_Braun

Aus dem Git von DHL BCS API SDK.

Unter dem Punkt Create Shipment Order in der Readme gibt es:
$logger = new \Psr\Log\NullLogger();

$serviceFactory = new \Dhl\Sdk\Paket\Bcs\Service\ServiceFactory();
$service = $serviceFactory->createShipmentService($authStorage, $logger, $sandbox = true);

$orderConfiguration = new \Dhl\Sdk\Paket\Bcs\Service\ShipmentService\OrderConfiguration(
    $printOnlyIfCodable = true,
    $combinedPrinting = null,
    $docFormat = \Dhl\Sdk\Paket\Bcs\Api\Data\OrderConfigurationInterface::DOC_FORMAT_PDF,
    $printFormat = \Dhl\Sdk\Paket\Bcs\Api\Data\OrderConfigurationInterface::PRINT_FORMAT_A4
);

$requestBuilder = new \Dhl\Sdk\Paket\Bcs\RequestBuilder\ShipmentOrderRequestBuilder();
$requestBuilder->setShipperAccount($billingNumber = '22222222220101');
$requestBuilder->setShipperAddress(
    $company = 'DHL',
    $country = 'DE',
    $postalCode = '53113',
    $city = 'Bonn',
    $street = 'Charles-de-Gaulle-Straße',
    $streetNumber = '20'
);
$requestBuilder->setRecipientAddress(
    $recipientName = 'Jane Doe',
    $recipientCountry = 'DE',
    $recipientPostalCode = '53113',
    $recipientCity = 'Bonn',
    $recipientStreet = 'Sträßchensweg',
    $recipientStreetNumber = '2'
);
$requestBuilder->setShipmentDetails($productCode = 'V01PAK', $shipmentDate = new \DateTime());
$requestBuilder->setPackageDetails($weightInKg = 2.4);

$shipmentOrder = $requestBuilder->create();
$shipments = $service->createShipments([$shipmentOrder], $orderConfiguration);

MfG

31.01.2025 14:56

8 Horst_Braun

Oh!! Super. Das geht. Vielen Dank.

Mit getShipmentLabel() habe ich schon viel herumprobiert. Aber nicht genauso.

Danke.

MfG

31.01.2025 15:40

9 MaJun97

In deinem Fall handelt es sich um eine private Eigenschaft in der Shipment-Klasse, weshalb du nicht direkt mit $shipments[0]->shipmentLabel darauf zugreifen kannst.

Lösungsmöglichkeiten:
1. Reflection API nutzen (empfohlen, falls kein Getter vorhanden ist)
Da shipmentLabel als private deklariert ist, kannst du die Reflection API verwenden, um auf die private Eigenschaft zuzugreifen:

$reflection = new ReflectionClass($shipments[0]);
$property = $reflection->getProperty('shipmentLabel');
$property->setAccessible(true); // Ermöglicht den Zugriff auf die private Eigenschaft
$ergebnis = $property->getValue($shipments[0]);

echo $ergebnis; // Sollte "Testergebnis" ausgeben

2. Prüfen, ob ein Getter vorhanden ist
Falls die Shipment-Klasse eine Methode zum Abrufen der Labels bereitstellt (z. B. getShipmentLabel()), solltest du diese verwenden:

$ergebnis = $shipments[0]->getShipmentLabel();
echo $ergebnis;

Falls du dir nicht sicher bist, welche Methoden in der Shipment-Klasse existieren, kannst du es mit get_class_methods() überprüfen:


print_r(get_class_methods($shipments[0]));
Falls du eine Methode wie getShipmentLabel() siehst, kannst du diese nutzen.

3. Falls du Zugriff auf die Shipment-Klasse hast
Falls du die Shipment-Klasse selbst bearbeiten kannst, solltest du dort einen Getter hinzufügen:

class Shipment {
    private $shipmentLabel = "Testergebnis";

    public function getShipmentLabel() {
        return $this->shipmentLabel;
    }
}

Dann kannst du einfach:

$ergebnis = $shipments[0]->getShipmentLabel();
echo $ergebnis;

Falls du die Klasse jedoch nicht bearbeiten kannst (z. B. weil sie aus einer externen Bibliothek stammt), bleibt Reflection API die beste Option.

07.02.2025 20:02

10 Horst_Braun

Super gut erklärt. Vielen Dank.

08.02.2025 14:57