paolo@bimodesign.com | +34 608 61 64 10

Framework

        

PHP stdClass...array oggetto per XML

Nella documentazione ufficiale di php possiamo leggere la seguente definizione:

stdClass is the default PHP object. stdClass has no properties, methods or parent.
It does not support magic methods, and implements no interfaces.
When you cast a scalar or array as Object, you get an instance of stdClass.
You can use stdClass whenever you need a generic object instance.


Quindi per stdClass, si intende una classe generica di PHP che possiamo utilizzare per raggruppare varie proprieta' di un oggetto, in una forma simile a quella che utilizzermo con un array.

Per creare l'oggetto, occorre innanzitutto istanziare la relativa classe e poi gli associamo due stringhe, come di seguito vi illustro con un semplice esempio

    myObject = new stdClass;
    myObject -> firstProperty = "qwerty";
    myObject -> otherProperty = "another qwerty".

Come potete osservare, l'assegnazione avviene usando il costrutto "->" associato all'elemento della classe-array.
Naturalmete e' possibile definire strutture piu' complesse, che prevedano la creazione di array nella classe myObject.
Ad esempio

myObject->firstLevel[$index]->StartDay=$sStartDay;
myObject->firstLevel[$index]->EndDay=$sEndDay;

Insomma, come potete osservare c'e' molta flessibilita'.
E quando si parla di flessibilita', viene subito in mente il formato XML :)
Capita spesso che per l'interazione tra PHP e un web service, si utilizzi l'oggetto stdClass.
Facciamo un esempio di una semplicissima struttura xml di interscambio di dati
(nota: tralascio in questo momento qualsiasi spiegazione sulla sintassi XML, a cui dedichero' presto una spiegazione dettagliata)

Se dobbiamo inviare i dati con questo formato XML, ad esempio, per gli orari invernali di una tratta ferroviaria, questo potrebbe essere lo schema che dobbiamo passare al webservice

<typeTimeTrain>
<defineTime>
  <validateFrom>?</validateFrom>
  <validateTo>?</validateTo>
  <idDay>?</idDay>
  <Price>
    <normalPrice>?</normalPrice>
    <discountPrice>?</discountPrice>
  </Price>
  <detailDay>
    <typeDay>?</typeDay>
    <nameDay>?</nameDay>
  </detailDay>
</defineTime>
<nameTimeTrain>

Per costruire questo oggetto, dove abbiamo l'array principale defineTime e due array Price e detailDay con un solo elemento, utilizziamo il seguente codice


$aTimeTrain=new stdClass();
$iDefineTime=0;

// Il primo elemeno
$aTimeTrain->typeTimeTrain=$sTypeTimeTrain;

foreach (ciclo per estrazione dei dati da un precedente array){
   $aTimeTrain->defineTime[$iDefineTime]->validateFrom=$sValidateFrom;
   $aTimeTrain->defineTime[$iDefineTime]->validateTo=$sValidateTo;
   $aTimeTrain->defineTime[$iDefineTime]->idDay=$iIdDay;

   // L'array Price
   $aTimeTrain->defineTime[$iDefineTime]->Price->normalPrice=$sNormalPrice;
   $aTimeTrain->defineTime[$iDefineTime]->Price->discountPrice=$sDiscountPrice;

   // L'array detailDay
   $aTimeTrain->defineTime[$iDefineTime]->detailDay->typeDay=$iTypeDay;
   $aTimeTrain->defineTime[$iDefineTime]->detailDay-vnameDay=$sNameDay;
   
   $iDefineTime++;
}

$aTimeTrain->nameTimeTrain=$sNameTimeTrain;

Il risultato, stampabile come sempre con l'istruzione print_r()

stdClass Object
(
    [typeTimeTrain] => 1
    [defineTime] => Array
        (
            [0] => stdClass Object
                (
                    [validateFrom] => 2010-08-23
                    [validateTo] => 2010-08-23
                    [idDay] => 1
                    [Price] => stdClass Object
                        (
                            [normalPrice] => 10.35
                            [discountPrice] => 5.22
                        )

                    [detailDay] => stdClass Object
                        (
                            [typeDay] => W
                            [nameDay] => Lunedi
                        )
                )

            [1] => stdClass Object
                (
                    [validateFrom] => 2010-08-23
                    [validateTo] => 2010-08-23
                    [idDay] => 1
                    [Price] => stdClass Object
                        (
                            [normalPrice] => 11.66
                            [discountPrice] => 8.22
                        )

                    [detailDay] => stdClass Object
                        (
                            [typeDay] => H
                            [nameDay] => Martedi
                        )
                )

             [2] => stdClass Object
             ...etc...
        )

    [nameTimeTrain] => Invernale
)