Donnerstag, 22 Februar, 2018

Wer ist schon darüber gestolpert, dass man protected Propertys aus Objekten nicht via json_encode oder ähnlichem exportieren kann. Mir ist das in einem Projekt passiert, wo ich in einer Schnittstelle ein Objekt zurück erhalte und an eine andere Schnittstelle via json übergeben wollte. Ich bin daran verzweifelt, da das Objekt wirklich komplex war.

Hier ist aber eine kleine Funktion, die ein Arbeitskollege kurz "gebastelt" hat, um alle Propertys eines Objekts public zu setzen und somit problemlos zu exportieren \o/



function getProtectedAsPublicObject($oObj) {
    if (is_object($oObj)) {
        $oReturn = new stdClass();
        $reflect = new ReflectionObject($oObj);
        $oReflectionProperty_arr = $reflect->getProperties();
        foreach ($oReflectionProperty_arr as $oReflectionProperty) {
            if(!$oReflectionProperty->isStatic()) {
                $cKeyName = $oReflectionProperty->getName();
                $oReflectionProperty->setAccessible(true);
                $xValue = $oReflectionProperty->getValue($oObj);
                if (is_object($xValue) || is_array($xValue)) {
                    $oReturn->{$cKeyName} = getProtectedAsPublicObject($xValue);
                } elseif (isset($xValue) && $xValue !== null) {
                    $oReturn->{$cKeyName} = $xValue;
                }
            }
        }
        return $oReturn;
    } elseif (is_array($oObj)) {
        $xReturn_arr = array();
        foreach ($oObj as $cKeyName => $xValue) {
            if (is_object($xValue) || is_array($xValue)) {
                $xReturn_arr[$cKeyName] = getProtectedAsPublicObject($xValue);
            } elseif (isset($xValue) && $xValue !== null) {
                $xReturn_arr[$cKeyName] = $xValue;
            }
        }
        return $xReturn_arr;
    }
}

Nun kann man via getProtectedAsPublicObject ein json exportieren :)

json_encode(getProtectedAsPublicObject($object));

Vielen Dank Andre !