Reflexión sobre Objetos de Datos de Servicio

Los SDOs son conscientes de la estructura que representan y para la que fueron creados (el modelo). Por ejemplo, un SDO Compañía creado usando el esquema XML Compañía de arriba solamente le estaría permitido contener objetos de datos TipoDepartamento, los cuales a su vez sólo pueden contener objetos de datos TipoEmpleado.

A veces es útil poder acceder a la información del modelo en tiempo de ejecución. Por ejemplo, para generar automáticamente una interfaz de usuario y rellenar un objeto de datos. A la información del modelo se accede usando reflexión.

Ejemplo #1 Reflexión sobre un objeto de datos

El siguiente ejemplo muestra cómo se puede usar la reflexión en un objeto de datos Empleado vacío.

<?php
  
// Crear el objeto de datos empleado (p.ej. desde un Servicio de Acceso a Datos XML)
  
$empleado = ...;
  
$reflexión = new SDO_Model_ReflectionDataObject($empleado);
  print(
$reflexión);
?>

El resultado del ejemplo sería:

object(SDO_Model_ReflectionDataObject)#4 { - ROOT OBJECT - Type { 
ENCompañía:TipoEmpleado[3] { commonj.sdo:String $nombre; 
commonj.sdo:String $NS; commonj.sdo:Boolean $director; } }

Al usar print con SDO_Model_ReflectionDataObject se escribe el modelo del objeto de datos. Se puede observar que el tipo ENCompañía:TipoEmpleado tiene tres propiedades, y que pueden verse sus nombres junto con sus tipos. Observe que los tipos primitivos están enumerados como tipos de SDO (p.ej. espacio de nombres commonj.sdo, tipo String). Esto es nada más y nada menos que el modelo del SDO, y cuando estos tipos aparecen en una aplicación, pueden ser tratados como sus tipos equivalentes de PHP (p.ej., string y booleano).

Ejemplo #2 Acceder a la información del tipo

Se puede consultar la información del tipo de un objeto de datos usando reflexión. El siguiente ejemplo comprueba el tipo que corresponde a un objeto de datos, en vez de un tipo primitivo, y luego recorre las propiedades del tipo, escribiendo el nombre de cada propiedad ($tipo y $propiedad son objetos SDO_Model_Type y SDO_Model_Property, respectivamente).

<?php
  
// Crear el objeto de datos empleado (p.ej. desde un Servicio de Acceso a Datos XML)
    
$empleado = ...;
    
$reflexión = new SDO_Model_ReflectionDataObject($empleado);
    
$tipo $reflexión->getType();
    if (! 
$tipo->isDataType()) {
        foreach (
$tipo->getProperties() as $propiedad) {
            print 
$propiedad->getName() . "\n";
        }
    }
?>

El resultado del ejemplo sería:

nombre
NS
director