Manuel PHP
Précédent |  | Suivant

# CXXXVI. Fonctions SDO

# Introduction

Les Objets de Service de Données (Service Data Objects (SDOs)) permet les applications PHP de travailler avec des données provenant de différentes sources (comme une requête de base de données, un fichier XML et une feuille de tableau) en utilisant une simple interface.

Chaque différente sorte de source de données requiert un Service d'Accès de Données (Data Access Service (DAS)) pour fournir un accès aux données dans la source de données. Dans votre application PHP, vous utilisez un DAS pour créer une instance SDO qui représente des données dans la source de données. Vous pouvez alors fixer et récupérer des valeurs dans l'instance SDO en utilisant l'interface SDO standard. Finalement, vous pouvez utiliser un DAS pour écrire les données modifiées à une source de données (normalement la même).

Voyez la liste des Services d'Accès de Données pour des détails sur ceux actuellement disponibles. En plus des DASs fournis, SDO fournit aussi des interfaces pour permettre les autres à être implémentés (voyez la section sur Interface SDO Service d'Accès de Données pour plus de détails).

Cette extension est dérivée des concepts pris des Spécification d'Objets de Service de Données. Elle inclut une version de Apache Tuscany SDO 2.0 pour le projet C++.

## La Structure d'un Objet de Service de Données

Une instance d'Objet de Service de Données est fait d'un arbre d'objets de données. L'arbre est défini par des relations contenues entre les objets de données. Par exemple, une objet de données Compagnie peut consister en un nombre d'objets de données Département et donc la Compagnie devrait avoir une relation contenue avec les Départements.

Un SDO peut aussi avoir des références non contenues entre les objets de données dans l'arbre. Par exemple, un objet de données Employé peut faire référence à un autre Employé pour identifier son mentor.

Les données peuvent se référencer entre eux, mais peuvent aussi avoir des propriétés primitives. Par exemple, l'objet de données Compagnie pourrait avoir une propriété appelée "nom" de type chaîne de caractères pour contenir le nom de la compagnie (par exemple, "Acme").

Chacune de ces propriétés de l'objet de données - références contenues, références non-contenues ou propriétés primitives - peut avoir plusieurs valeurs ou une seule. Dans l'exemple ci-dessous, "Departements" a plusieurs valeurs alors que le nom de la compagnie n'en a qu'une.

En PHP, chaque objet de données SDO est représenté en tant qu'objet PHP. Les propriétés de l'objet de données peuvent être accédées en utilisant soit la synthaxe orientée objet, soit la synthaxe de tableaux associatifs. Nous verrons quelques exemples de cela plus tard dans la documentation.

# Pré-requis

L'extension SDO requiert PHP 5.1 ou supérieur. Elle nécessite également la bibliothèque libxml2. Normalement, libxml2 devrait être déjà installée mais si ce n'est pas le cas, vous pouvez la télécharger depuis http://www.xmlsoft.org/.

# Installation

Systèmes Unix

1. Vous pouvez télécharger et installer la dernière version stable des trois composants SDO - le core SDO, le XML DAS et le relationnel DAS - avec la commande :

       pecl install sdo

   Cette commande va construire les bibliothèques partagées SDO et XML mais va aussi installer les fichiers PHP permettant le relationnel DAS.

   Si vous voulez installer la dernière version béta, exécutez plutôt la commande :

       pecl install sdo-beta

2. La commande pecl installe automatiquement les modules SDO et SDO_DAS_XML dans votre dossier d'extensions PHP. Pour activer les extensions SDO, vous devez ajouter les lignes suivantes à votre `php.ini` :

       extension=sdo.so
       extension=sdo_das_xml.so

   Pour plus d'informations sur la constructions de paquets PEAR, consultez la section de la documentation sur l'installation PECL.

Windows

1. Les dernières bibliothèques DLLs pour le code SDO et le XML DAS peuvent être téléchargées respectivement depuis php_sdo.dll et php_sdo_das_xml.dll.

   Notez qu'actuellement, le site pecl4win ne fournit pas ces binaires pour le niveau de version courante ; vous ne pouvez télécharger que le dernier niveau.

2. La commande pecl installe automatiquement les modules SDO et SDO_XML_DAS dans votre dossier d'extensions PHP. Pour activer les extensions SDO, vous devez ajouter les lignes suivantes à votre `php.ini` :

       extension=php_sdo.dll
       extension=php_sdo_das_xml.dll

3. Le relationnel DAS peut être téléchargé et installé avec la commande :

       pecl install -B sdo

   Le relationnel DAS est écrit en PHP. Vous devez mettre à jour votre include_path dans votre `php.ini` pour pointer vers le dossier contenant `sdo/DAS/Relational`.

Construire SDO sur Linux

Cette section décrit comment construire le noyau SDO et le XML DAS sur Linux. Vous devriez avoir besoin seulement de savoir comment faire cela seulement si vous souhaitez construire une version récente que vous auriez téléchargée de CVS.

1. Changez le dossier principal d'extension : cd < où se trouve le code sdo >

2. Exécutez phpize, qui fixera l'environnement pour compiler le SDO et le Service de d'Accès de Données XML.

3. Ensuite, exécutez ./configure; make; make install. Veuillez noter, vous devriez avoir besoin de vous identifier en tant que root pour installer cette extension.

4. Vérifiez que ces modules sont chargés par PHP, en ajoutant extension=sdo.so et extension=sdo_das_xml.so dans votre fichier `php.ini` dans cet ordre.

# Services d'Accès de Données

La table ci-dessous liste les Services d'Accès de Données SDO actuellement fournis :

Nom DAS | Description
--- | ---
SDO_DAS_XML | Un Service d'Accès de Données XML supportant la lecture/écriture SDOs comme documents XML.
SDO_DAS_Relational | Un Service d'Accès de Données basé sur PDO supportant la lecture/écriture SDO aux bases de données relationnelles. Implémente une politique optimiste de mises à jour concourante.

# Limitations

Limitations d'Implémentation

La liste suivante contient les limitations dans l'implémentation courante de SDO :

1. Il n'y a pas de support pour le jeu de caractère multi-byte. Ceci doit être considéré, dépendemment de la nécessité de la communauté, dans la version de PHP où le support de l'Unicode est activé. Voir les fonctions Unicode.

Limitations SDO

Les concepts suivants de SDO 2.0 ne sont pas supportés dans l'implémentation courante de PHP. Ce n'est pas nécessairement le cas que ceux-ci seront ajoutés avec le temps. Leur inclusion dépendra des besoins de la communauté.

1. Relations bidirectionnelles.

2. Type et propriété alias noms.

3. Propriétés en lecture seule.

4. Les classes d'aide définies dans SDO 2.0 ne sont pas directement implémentées. Cependant, une fonction équivalente est fournie dans un style plus naturel pour PHP. Par exemple, la fonction CopyHelper::copy() est fournie en utilisant le mot clé clone de PHP pour un objet de données.

# Exemples

Les exemples ci-dessous assument qu'un SDO est créé avec le schéma et l'information de l'instance montrée ci-dessous, en utilisant le Service d'Accès de Données.

L'instance du document ci-dessous décrit un compagnie simple, nommée 'MegaCorp', qui contient un seul département, nommé 'Advanced Technologies'. Ce département contient trois employés. La compagnie 'employeeOfTheMonth' référence le second employé, 'Jane Doe'.

    <?xml version="1.0" encoding="UTF-8" ?>
    <company xmlns="companyNS" name="MegaCorp"
             employeeOfTheMonth="E0003">
     <departments name="Advanced Technologies" location="NY" number="123">
      <employees name="John Jones" SN="E0001"/>
      <employees name="Jane Doe" SN="E0003"/>
      <employees name="Al Smith" SN="E0004" manager="true"/>
     </departments>
    </company>

L'élément racine de ce schéma est une compagnie. La compagnie contient des départements, et chaque département contient des employés. Chaque élément a un nombre d'attributs pour y stocker des valeurs comme le nom, un numéro de série et ainsi de suite. Finalement, la compagnie a également un attribut IDREF qui identifie un des employés comme 'employeeOfTheMonth'.

    <xsd:schema
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:sdo="commonj.sdo"
      xmlns:sdoxml="commonj.sdo/xml"
      xmlns:compagnie="compagnieNS"
      targetNamespace="compagnieNS">
      <xsd:element name="compagnie" type="compagnie:CompagnieType"/>
      <xsd:complexType name="CompagnieType">
        <xsd:sequence>
          <xsd:element name="departements" type="compagnie:DepartementType"
            maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="nom" type="xsd:string"/>
        <xsd:attribute name="employe_du_mois" type="xsd:IDREF"
          sdoxml:propertyType="compagnie:EmployeType"/>
       </xsd:complexType>
      <xsd:complexType name="DepartementType">
        <xsd:sequence>
          <xsd:element name="employes" type="compagnie:EmployeType"
            maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="nom" type="xsd:string"/>
        <xsd:attribute name="endroit" type="xsd:string"/>
        <xsd:attribute name="numero" type="xsd:int"/>
      </xsd:complexType>
      <xsd:complexType name="EmployeType">
        <xsd:attribute name="nombre" type="xsd:string"/>
        <xsd:attribute name="NS" type="xsd:ID"/>
        <xsd:attribute name="directeur" type="xsd:boolean"/>
      </xsd:complexType>
    </xsd:schema>

Un Service d'Accès de Données XML voit ce schéma comme un SDO. Les attributs comme "name" deviennent des propriétés primaires, les séquences d'employés deviennent une relation de contenu à multiples valeurs, et ainsi de suite. Notez que les relations de contenu sont représentées comme un type complexe contenu dans un autre, où les références non-contenues sont représentées en terme d'ID et d'IDREF, avec un attribut sdoxml:propertyType spécial spécifiant le type de la référence non-contenue.

# Fixe et Récupère les Valeurs des Propriétés

Les exemples suivants présument que $compagnie est la racine d'un arbre d'objets de données créés depuis le schéma et le document montré ci-dessus.

Exemple 1. Accès via les noms de Propriété

Les propriétés des objets de données peuvent être accéder en utilisant la syntaxe d'accès de propriété d'objet. L'exemple fixe le nom de compagnie à 'Acme'.

`<?php $compagnie->nom = 'Acme'; ?>`

Exemple 2. Accès via le nom de la propriété en tant que tableau indexé

Nous pouvons également accéder aux propriétés en utilisant lun tableau associatif. La forme la plus simple est d'utiliser le nom de la propriété dans le tableau indexé. Par exemple, ce qui suit définit le nom de la compagnie et récupère l'"employeeOfTheMonth".

`<?php $company['name'] = 'UltraCorp'; $eotm = $company['employeeOfTheMonth']; ?>`

Exemple 3. Itération d'objet de données

Vous pouvons itérer les propriétés d'un objet de données en utilisant l'instruction foreach.

`<?php $eotm = $company->employeeOfTheMonth; foreach ($eotm as $name => $value) { echo "$name: $value\n"; } ?>`

Affichera :

    name: Jane Doe
    SN: E0003

The 'manager' property is not output, because it has not been set.

Exemple 4. Accès à une propriété à valeurs multiples par le nom

Les propriétés à valeurs multiples d'un objet de données peuvent être accédées en utilisant la synthaxe des noms de propriétés de l'objet. Ce qui suit récupère la liste des départements.

`<?php $departments = $company->departments; ?>`

Exemple 5. Accès aux éléments à valeurs multiples

Nous pouvons accéder aux éléments individuels des propriétés à valeurs multiples en utilisant la synthaxe des tableaux. Ce qui suit permet d'accéder au premier département de la compagnie.

`<?php $ad_tech_dept = $company->departments[0]; ?>`

Exemple 6. Itération d'une propriété à valeurs multiples

Les propriétés à valeurs multiples peuvent être itérées en utilisant l'instruction foreach.

`<?php foreach ($company->departments as $department) { // ... } ?>`

Each iteration will assign the next department in the list to the variable $department.

Exemple 7. Accès aux propriétés chaînées

Nous pouvons chaîner les références des propriétés sur une seule ligne. Ce qui suit définit et récupère le nom du premier département.

`<?php $company->departments[0]->name = 'Emerging Technologies'; $dept_name = $company->departments[0]->name; ?>`

En utilisant la synthaxe des tableaux associatifs, c'est l'équivalent de

`<?php $company['departments'][0]['name'] = 'Emerging Technologies'; $dept_name = $company['departments'][0]['name']; ?>`

Dans tous les cas, la variable dept_name est définie à 'Emerging Technologies'.

Exemple 8. Navigation XPath

Le tableau associatif indexé peut être une expression façon XPath. Les expressions valides sont définies par une sous définission d'XPath.

Deux façons d'indexations de propriétés à valeurs multiples sont supportées. La remière est la synthaxe de tableau XPath standard dont l'index commence à 0, la seconde est une extension SDO à XPath avec un index qui commence à 0. La synthaxe standard est :

`<?php $jane_doe = $company["departments[1]/employees[2]"]; ?>`

et la syntahxe de l'extension SDO XPath est :

`<?php $jane_doe = $company["departments.0/employees.1"]; ?>`

Both these examples get the second employee from the first department.

Exemple 9. Requête XPath

Nous pouvons utiliser XPath pour effectuer une requête et ainsi identifier des parties d'un objet de données basé sur des données instanciées. Ce qui suit récupère le manager depuis le département 'Advanced Technologies'.

`<?php $ad_tech_mgr = $company["departments[name='Advanced Technologies']/employees[manager=true]"]; ?>`

Exemple 10. Création d'objets de données fils

Un objet de données peut être une fraction pour ces objets de données fils. Un objet de données fils est automatiquement une partie des données. Ce qui suit ajoute un nouvel employé au département 'Advanced Technologies'.

`<?php $ad_tech_dept = $company["departments[name='Advanced Technologies']"]; $new_hire = $ad_tech_dept->createDataObject('employees'); $new_hire->name = 'John Johnson'; $new_hire->SN = 'E0005'; $new_hire->manager = false; ?>`

Exemple 11. Effacement d'une propriété primitive

Nous pouvons utiliser la fonction isset() et unset() pour tester et effacer des éléments de l'objet de données.

Ce qui suit efface le nom du premier département.

`<?php unset($company->departments[0]->name); ?>`

Exemple 12. Effacement d'un objet de données

La fonction unset() peut également être utilisée pour effacer un objet de données de l'arbre. L'exemple suivant montre comment John Jones à quitter la compagnie...

`<?php unset($company->departments[0]->employees[0]); ?>`

Exemple 13. Effacement d'un objet de données référencé

Ce qui suit efface 'employeeOfTheMonth' de la compagnie. Si c'est une relation contenue, alors l'employé sera effacé de la compagnie. (probablement pas une bonne idée que d'effacer chaque mois votre meilleur employé !) mais si c'est une relation non-contenue, l'employé référencé restera dans le département de la compagnie, mais ne sera plus accessible via la propriété 'employeeOfTheMonth'.

`<?php if (isset($company->employeeOfTheMonth)) { unset($company->employeeOfTheMonth); } ?>`

Exemple 14. Accès via l'index de la propriété

Les propriétés de l'objet de données peuvent être accédées via leurs index en utilisant la synthaxe de tableaux. L'index de la propriété est la position dont la propriété apparait dans le modèle (dans ce cas, le schéma XML). Nous pouvons voir dans le schéma listé ci-dessus que l'attribut du nom de la compagnie est la seconde propriété de la compagnie (l'interface SDO ne fait pas de distinction entre les attributs XML et les éléments). Ce qui suit va définir le nom de la compagnie en 'Acme', avec le même résultat que lors de l'accès via le nom de la propriété.

`<?php $company[1] = 'Acme'; ?>`

L'utilisation directe de l'index dans ce cas est fragile. Normalement, la synthaxe reposant sur le nom de la propriété est préférable, mais l'index des propriétés peut être nécessaire dans des cas très spéciaux.

# Travailler avec des Objets de Données en Séquence

Des objets de données en Séquence sont des SDOs peuvent tracer l'ordre des propriétés à travers les propriétés des objets de données. Ils peuvent aussi contenir des éléments de texte non structuré (element de texte qui n'appartient à aucune des propriétés SDO). Des objets de données en Séquence sont utiles pour travailler avec des documents XML qui permettent du texte non structuré (c'est-à-dire mixed=true) ou si les éléments peuvent être intercalée (<A/><B/><A/>). Ceci peut se produire par exemple lorsque le schéma définit maxOccurs>1 sur un élément qui est un complexType avec un choix de l'ordre.

Les exemples ci-dessous assument qu'un SDO est créé avec le schéma et l'information de l'instance montrée ci-dessous, en utilisant le Service d'Accès de Données.

Le schéma ci-dessous décrit le format d'une lettre. La lettre peut optionnellement contenir trois propriétés; date, prenom et nomFamille. Le schéma indique mixed="true" qui signifie que le texte non structuré peut être entremêlé entre les trois propriétés.

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:lettre="http://lettreSchema"
      targetNamespace="http://lettreSchema">
      <xsd:element name="lettres" type="lettre:FormLettre"/>
      <xsd:complexType name="FormLettre" mixed="true">
        <xsd:sequence>
          <xsd:element name="date" minOccurs="0" type="xsd:string"/>
          <xsd:element name="prenom" minOccurs="0" type="xsd:string"/>
          <xsd:element name="nomFamille" minOccurs="0" type="xsd:string"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>

L'exemple suivant est une instance du document lettre. Il contient les trois propriétés de la lettre; date, prenom et nomFamille, et a des éléments de texte non structuré pour l'adresse et le corps de la lettre.

    <lettre:lettres xmlns:lettre="http://lettreSchema">
      <date>1er Mars 2005</date>
      Mutual of Omaha
      Wild Kingdom, USA
      Chère
      <prenom>Casy</prenom>
      <nomFamille>Crocodile</nomFamille>
      S'il vous plaît, achetez plus de requin imperméable.
      Votre prime est passée date.
    </lettre:lettres>

Lorsque chargé, l'objet de données de lettre aura la séquence et les indices montrés dans la table ci-dessous :

Index de Séquence | Index:Nom | Valeur
--- | --- | ---
0 | 0:date | 1er Mars 2005
1 | - | Mutual of Omaha
2 | - | Wild Kingdom, USA
3 | - | Chère
4 | 1:prenom | Casy
5 | 2:nomFamille | Crocodile
6 | - | S'il vous plaît, achetez plus de requin imperméable.
7 | - | Votre prime est passée date.

Pour s'assurer que la séquence des indices soit maintenue, les objets de données en séquence devraient être manipulés à travers de l'interface SDO_Sequence. Ceci permet à l'instance de l'objet de données à être manipulée en tant qu'index de séquence plutôt qu'avec un index de propriété (montré dans la table ci-dessus). Les exemples suivants assument que l'instance de la lettre a été chargée dans l'objet de données référencé par la variable $lettre.

Exemple 15. Récupération de l'interface SDO_Sequence

Nous obtenons la séquence de l'objet de données en utilisant la méthode getSequence(). La suite récupère la séquence pour l'objet de données de la lettre.

`<?php $lettre_seq = $lettre->getSequence(); ?>`

Tous les exemples suivants assument que la variable $lettre_seq a été assigné de la séquence pour l'objet de données de la lettre.

Exemple 16. Récupère/Fixe des valeurs de séquence

Nous pouvons récupérer et fixer des valeurs individuelles (en incluant le texte non structuré) en utilisant les index de séquence. L'exemple suivant fixe le prenom à 'Snappy' et récupère la dernière valeur de séquence (le texte non structuré, 'Votre prime est passée date.').

`<?php $lettre_seq[4] = 'Snappy'; $texte = $lettre_seq[count($lettre_seq) - 1]; ?>`

Exemple 17. Itération de Séquence

Nous pouvons itérer à travers des valeurs de séquence individuellement en utilisant foreach. L'exemple suivant passe au travers des valeurs individuelles dans l'ordre séquentiel.

`<?php foreach ($lettre->getSequence() as $valeur) { // ... } ?>`

Exemple 18. Séquence versus Objet de Données

Fixer des valeurs à travers l'interface d'objet de données peut amener à ce que les valeurs ne fassent pas partie de la séquence. Une valeur fixée avec un objet de données sera seulement accessible avec la séquence si la propriété était déjà une partie de la séquence. L'exemple suivant fixe le nomFamille à travers de l'objet de données et le récupère par la séquence. Ceci est correct puisque nomFamille existe déjà dans la séquence. S'il n'avait pas été fixé, alors nomFamille devrait être fixé à 'Smith', mais ne devrait pas faire partie de la séquence.

`<?php $lettre[2] = 'Smith'; $nom_famille = $lettre_seq[5]; ?>`

Exemple 19. Ajout à une séquence

Nous pouvons ajouter de nouvelles valeurs à une séquence en utilisant la méthode SDO_Sequence::insert(). Les exemples suivants assument que les propriétés 'prenom' et 'nomFamille' sont non fixées.

`<?php
// Ajoute une valeur prenom à la séquence
// valeur : 'Smith'
// index séquence : NULL (ajout)
// identifiant de propriété : 1 (index propriété prenom)
$lettre_seq->insert('Smith', NULL, 1);
// Ajoute une valeur nomFamille à la séquence
// valeur : 'Jones'
// index séquence : NULL (ajout)
// identifiant de propriété : 'nomFamille' (nom propriété nomFamille)
$lettre_seq->insert('Jones', NULL, 'nomFamille');
// Ajoute du texte non structuré
// valeur : 'Annule Inscription.'
// index séquence : absent (ajout)
// identifiant de propriété : absent (texte non structuré)
$lettre_seq->insert('Annule Inscription.');
// Ajoute du nouveau texte non structuré. Les séquence valeurs suivantes
// d'ordre sont décalées vers le haut
// valeur : 'À l'attention de :'
// index séquence : 1 (insert comme second élément)
// identifiant de propriété : absent (texte non structuré)
$lettre_seq->insert('À l'attention de :', 1);
?>`

Exemple 20. Suppression d'une séquence

Nous pouvons utiliser les fonctions isset() et unset() pour tester et supprimer des items de la séquence (Note : unset() laisse actuellement les valeurs dans l'objet de données, mais ce comportement est devrait changer et supprimer les données de l'objet de données). Une séquence se comporte comme une liste contiguë; donc, la suppression d'un item au milieu de la liste décalera les entrées d'un indice plus haut vers le bas. L'exemple suivant teste pour vérifier si la première séquence d'élément est fixé et la détruit si elle l'est.

`<?php if (isset($lettre_seq[0])) { unset($lettre_seq[0]); } ?>`

# Réflexion sur des Objets de Service de Données

Les SDOs ont une connaissance de la structure qu'ils ont créée pour la représentation (le modèle). Par exemple, une Compagnie SDO créée utilisant le schéma de Compagnie XML ci-dessus devrait seulement être permis de contenir des objets de données DepartementType qui à leur tour devrait contenir seulement des objets de données EmployeType.

Parfois, il est utile d'être capable d'accéder ces informations de modèle à l'exécution. Par exemple, cela pourrait être utilisé pour générer automatiquement une interface d'usager pour remplir un objet de données. Les informations de modèle sont accédées en utilisant la réflexion.

Exemple 21. Réflexion sur les Objets de Données

L'exemple suivant montre comment nous pouvons utiliser la réflexion sur un objet de données vide Employe.

`<?php // Crée l'objet de données employe (par exemple, à partir de Service d'Accès // de données XML) $employe = ...; $reflexion = new SDO_Model_ReflectionDataObject($employe); print($reflexion); ?>`

L'exemple ci-dessus va afficher :

    object(SDO_Model_ReflectionDataObject)#4 { - ROOT OBJECT - Type {
    compagnieNS:EmployeType[3] { commonj.sdo:String $nom;
    commonj.sdo:String $NS; commonj.sdo:Boolean $directeur; } }

L'utilisation de print sur SDO_Model_ReflectionDataObject écrit à l'écran les données du modèle de l'objet. Nous pouvons voir à la sortie que le type compagnieNS:EmployeType a trois propriétés et nous pouvons voir le noms de ces propriétés avec leur type. Notez, les types primitifs sont listés en tant que types SDO (par exemple, commonj.sdo namespace, String type). Cela vaut la peine de noter que c'est le modèle SDO et lorsqu'ils sont utilisés dans l'application, ils peuvent être traités comme des types équivalent PHP (par exemple, chaîne de caractères et booléen).

Exemple 22. Accès d'informations de type

Nous pouvons effectuer une requête de type d'informations sur un objet de données en utilisant la réflexion. L'exemple suivant vérifie que le type corresponde à l'objet de données plutôt qu'à une primitive et alors itère à travers des propriétés de type, en affichant le nom de chaque propriété ($type et $property sont respectivement des objets SDO_Model_Type et SDO_Model_Property).

`<?php // Crée l'objet de données employe (par exemple, à partir de Service d'Accès // de données XML) $employe = ...; $reflexion = new SDO_Model_ReflectionDataObject($employe); $type = $reflexion->getType(); if (! $type->isDataType()) { foreach ($type->getProperties() as $property) { print $property->getName() . "\n"; } } ?>`

L'exemple ci-dessus va afficher :

    nom
    NS
    directeur

# Classes pré-définies

SDO consiste en trois blocs d'interface. Le premier bloc couvre les interfaces pour utiliser avec les applications typiques SDO. Celles-ci sont identifiées par le préfixe de package 'SDO_'. Le deuxième bloc est celui qui utilise les interfaces qui sont utilisées pour la réflexion, et travaille avec le modèle d'objet de données. Ces interfaces sont identifiées par le préfixe de package 'SDO_Model_'. Finalement, le troisième bloc est celui qui utilise les interfaces qui sont utilisées par les implémentations de Service d'Accès de Données et sont identifiées par le préfixe de package 'SDO_DAS_'. La majorité des utilisateurs SDO n'auront pas besoin d'utiliser ou de comprendre les interfaces 'SDO_Model_' et 'SDO_DAS_'.

## Interface Application pour programmer SDO

### SDO_DataObject

L'interface principale dans laquelle les objets de données sont manipulés. En plus des méthode ci-dessous, SDO_DataObjet étend les interfaces ArrayAccess, SDO_PropertyAccess (définit les méthodes __get() / __set() pour surcharger l'accès aux propriétés), Iterator et Countable.

#### Méthodes

- getSequence - récupère la séquence pour l'objet de données

- createDataObject - crée un objet de données enfant

- clear - détruit les propriétés d'un objet de données

- getContainer - récupère le conteneur (aussi connu en tant que 'parent') de l'objet de données

- getTypeName - récupère le nom du type de cet objet de données

- getTypeNamespaceURI - récupère l'URI de l'espace de noms du type de cet objet de données

### SDO_Sequence

L'interface dans lequel les objets de données en séquence peuvent être accédés pour préserver l'ordre parmi les propriétés de l'objet de données et pour permettre le texte non structuré. SDO_Sequence préserve les indices contigus et donc l'insertion ou la suppression d'éléments peut entraîner un décalage des autres éléments vers le haut ou vers le bas. En plus des méthodes ci-dessous, SDO_Sequence étend les interfaces ArrayAccess, Interator et Countable.

#### Méthodes

- getProperty - récupère la propriété pour un index de séquence donné

- move - déplace un élément d'un index vers un autre

- insert - insère une nouvelle valeur dans la séquence

### SDO_List

L'interface dans lequel les propriétés de plusieurs valeurs sont manipulées. En plus des méthodes définies ci-dessous, SDO_List étend ArrayAcces, Iterator et Countable. SDO_List préserve les indices contigus et donc l'insertion ou la suppression des éléments peut décaler les autres éléments vers le haut ou vers le bas.

#### Méthodes

- insert - insertion d'une nouvelle valeur dans la liste

### SDO_DataFactory

L'interface dans lequel les objets de données peuvent être créés. Un Service d'Accès de Données est responsable de remplir le modèle (c'est-à-dire, la configuration des classe de données avec le type et les informations de structure pour les objets de données qu'elle peut créer.) pour les classes et peut alors optionnellement retourner une instance ou une implémentation de l'interface de SDO_DataFactory.

#### Méthodes

- create - crée un nouvel objet de données

## SDO_Exception

Une exception SDO_Exception est lancée lorsque la demande de l'appelant ne peut être honorée. Les sous classes de SDO_Exception sont :

- SDO_PropertyNotSetException - la propriété spécifiée existe mais n'a pas été définie ou n'a pas de valeur par défaut

- SDO_PropertyNotFoundException - la propriété spécifiée ne fait pas partie du type de l'objet de données

- SDO_TypeNotFoundException - l'URI d'espace de noms spécifiée ou le nom du type est inconnu

- SDO_InvalidConversionException - la conversion entre les types d'assignement n'est pas possible

- SDO_IndexOutOfBoundsException - l'index numérique d'un objet de données, d'une séquence ou d'une liste n'est pas dans un intervalle valide

- SDO_UnsupportedOperationException - la demande n'a pû être honorée car elle n'est pas autorisée, par exemple, une tentative de définition d'une propriété en lecture seule

### Méthodes

Une méthode est ajoutée à celles héritées depuis la classe interne Exception :

- getCause - récupère la cause de cette exception SDO_Exception

## Interfaces de réflexion d'application pour programmer SDO

### SDO_Model_ReflectionDataObject

L'interface principale est utilisée pour la réflexion d'une instance d'objet de données pour obtenir son type de modèle et les informations de propriété. Elle est désignée pour suivre le motif de réflexion introduit dans PHP 5.

#### Constructeur

- __construct - construit un nouvel SDO_Model_ReflectionDataObject.

#### Méthodes

- export - récupère une chaîne décrivant l'objet de données.

- getType - récupère le SDO_Model_Type pour l'objet de données.

- getInstanceProperties - récupère les propriétés de l'instance de l'objet de données.

- getContainmentProperty - récupère la propriété qui définit la relation contenue de l'objet de données.

### SDO_Model_Type

L'interface dans lequel les informations de type de l'objet de données peuvent être récupérées. Cette interface peut être utilisée pour trouver le nom de type et l'espace de nom URI du type, si le type autorise l'ouverture du contenu, et ainsi de suite.

#### Méthodes

- getName - récupère le nom du type.

- getNamespaceURI - récupère l'espace de nom URI du type.

- isInstance - vérifie pour un objet de données s'il est une instance du type.

- getProperties - récupère les propriétés du type.

- getProperty - récupère une propriété de type.

- isDataType - vérifie pour voir si le type est une primitive de type scalaire.

- isSequencedType - vérifie pour voir s'il s'agit d'un type de séquence.

- isOpenType - vérifie pour voir s'il s'agit d'un type ouvert.

- isAbstractType - vérifie pour voir s'il s'agit d'un type d'abstraction.

- getBaseType - récupère le type de base de ce type (si un existe).

### SDO_Model_Property

L'interface dans lequel les informations de propriété d'objet peuvent être récupérées. Cette interface peut être utilisée pour trouver le type d'une propriété, si une propriété a une valeur par défaut, si une propriété est contenue ou référencée par son parent, sa cardinalité, et ainsi de suite.

#### Méthodes

- getName - récupère le nom de la propriété.

- getType - récupère le type de la propriété.

- isMany - vérifie pour voir si la propriété est de valeurs multiples.

- isContainment - vérifie pour voir si la propriété décrit une relation contenue.

- getContainingType - récupère le type qui contient cette propriété.

- getDefault - récupère la valeur par défaut pour une propriété.

## Interfaces de développeur Service d'Accès de Données SDO

### SDO_DAS_DataObject

L'interface dans lequel un Service d'Accès de Données peut accéder à SDO_DAS_ChangeSummary de l'objet de données. Le résumé de changement est utilisé par le Service d'Accès de Données pour vérifier les conflits lors des applications des changements à une source de données.

#### Méthodes

- getChangeSummary - récupère le résumé de changement pour un objet de données

### SDO_DAS_ChangeSummary

L'interface dans lequel l'historique de changement d'un objet de données est accédé. Le résumé de changement contient des informations pour n'importe quelles modifications sur un objet de données qui s'est produites lorsque la journalisation a débuté. Dans le cas de suppression ou de modification, les dernières valeurs sont aussi gardées dans le résumé de changement.

Si la journalisation n'est plus active, alors le résumé de changement contient seulement les changements faits jusqu'au point où la journalisation fut désactivée. La réactivation de la journalisation supprime le résumé de changement. Cela peut être utile lorsqu'un certain nombre de changements ont été écris par un DAS et un objet de données qui est réutilisé.

#### Méthodes

- beginLogging - démarre la journalisation des changements faits à l'objet de données

- endLogging - termine la journalisation des changements faits à l'objet de données

- isLogging - vérifie pour voir si la journalisation des changements est activée

- getChangedDataObjects - récupère une liste de d'objets de données qui ont été changés

- getChangeType - récupère le type de changement qui a été fait à l'objet de données

- getOldValues - récupère une liste des anciennes valeurs pour un objet de données

- getOldContainer - récupère un ancien conteneur d'objet de données pour un objet de données supprimé

### SDO_DAS_Setting

L'interface dans lequel l'ancienne valeur pour une propriété est accédée. Une liste des configurations est retournée par le résumé de changement dont la méthode est getOldValues().

#### Méthodes

- getPropertyIndex - récupère l'index pour la propriété changée

- getPropertyName - récupère le nom pour la propriété changée

- getValue - récupère l'ancienne valeur pour la propriété changée

- getListIndex - récupère la liste des index pour l'ancienne valeur si elle faisait partie d'une propriété à valeurs multiples

- isSet - vérifie pour voir si la propriété était fixée avant d'être modifiée

### SDO_DAS_DataFactory

L'interface pour construire le modèle pour un SDO_DataObjet. Le SDO_DAS_DataFactory est une classe abstraite fournissant une méthode statique qui retourne une classe d'implémentation de données concrète. L'implémentation est utilisée par les Services d'Accès de Données pour créer un modèle SDO à partir de leur modèle. Par exemple, un Service d'Accès de Données Relationnel peut créer et remplir un modèle SDO_DAS_DataFactory basé sur un schéma pour une base de données relationnelle.

#### Méthodes

- getDataFactory - méthodes statiques pour obtenir une instance de classe concrète de données

- addType - ajoute un nouveau type au modèle SDO

- addPropertyToType - ajoute une nouvelle propriété à une définition de type dans le modèle SDO

# Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

`SDO_DAS_ChangeSummary::NONE=0` (entier)

  Représente un changement de type 'none' (aucun).

`SDO_DAS_ChangeSummary::MODIFICATION=1` (entier)

  Représente un changement de type 'modification'.

`SDO_DAS_ChangeSummary::ADDITION=2` (entier)

  Représente un changement de type 'addition'.

`SDO_DAS_ChangeSummary::DELETION=3` (entier)

  Représente un changement de type 'deletion' (suppression).

Précédent | Sommaire | Suivant
satellite_object_to_string | Niveau supérieur | SDO_DAS_ChangeSummary::beginLogging