CXXXI. Fonctions SDO

Introduction

Avertissement

Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez ce module à vos risques et périls.

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 présentement 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

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. La suppression d'un objet de données qui contient une relation contenue à un autre objet de données supprimera aussi l'objet de données contenu. Par exemple, la suppression de l'objet de données Compagnie supprimera aussi 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. La suppression d'un objet de données qui possède une référence non contenue d'un autre objet de données ne supprimera pas l'objet de données référencé.

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").

Pré-requis

L'extension SDO requiert PHP 5.1 ou supérieur.

SDO Service d'Accès de Données XML, qui est construit en part entière avec cette extension requiert libxml2 (Testé avec libxml2 2.6.19) qui peut être téléchargé sur http://www.xmlsoft.org/.

Installation

Il y a plusieurs options, selon vous installez sur Windows ou Linux, et selon vous installez avec une version de mise à jour (un fichier .tgz provenant du site PECL) ou de la dernière mise à jour provenant de CVS. Le DAS Relationnel nécessite aussi une attention spéciale puisqu'il est écrit en PHP.

Les instructions sont susceptibles de changer puisque les progrès PHP 5.1 changent son statut de version bêta à version stable. Les instructions suivantes étaient correctes le 6 octobre 2005, lorsque PHP 5.1.0RC1 était la dernière version d'évaluation pour PHP et que 0.5.2 était la dernière version bêta de SDO.

Les options sont résumées dans la table suivante :

Dernière version/VersionWindowsLinux
Dernière version CVS

  • Les derniers DLLs pour le noyau de SDO et le XML DAS peuvent être téléchargés respectivement sur php_sdo et php_sdo_das_xml.

  • Téléchargez la dernière version de DAS Relationnel sur CVS vers un chemin PHP pointé par include_path.

  • Téléchargez la dernière version du noyau SDO et de XML DAS sur CVS et construisez les en fonctions des instructions ci-dessous pour construire sur Linux.

  • Téléchargez la dernière version de DAS Relationnel sur CVS vers un chemin PHP pointé par include_path.

Version

  • Il n'y a présentement aucun moyen de fourni pour construire la version du noyau SDO et XML DAS sur une machine de l'utilisateur. Vous serez seulement capable de récupérer les derniers DLLs du site de copie (voyez la ligne précédente de cette table).

  • Le DAS Relationnel peut être téléchargé et installé avec la commande :

    pear install -B <nom du package et version>

    Substituez le nom du package désiré et sa version, par exemple sdo-0.5.2, dans la commande ci-dessus.

  • Vous pouvez télécharger ces trois composants SDO - le noyau SDO, le XML DAS et le DAS Relationnel - avec la commande :

    pear install <nom du package et version>

    Substituez le nom du package désiré et sa version, par exemple sdo-0.5.2, dans la commande ci-dessus.

    Cette commande construira les bibliothèques partagées SDO et XML et installera aussi les fichiers PHP pour utiliser le DAS Relationnel.

Sans se soucier sur quelle plateforme ou avec quelle version de code vous avez installée, vous devrez ajouter les deux bibliothèques d'extension à votre fichier php.ini. Sur Windows, ajoutez :
extension=php_sdo.dll
extension=php_sdo_das_xml.dll
Sur Linux, ajoutez :
extension=sdo.so
extension=sdo_das_xml.so
Vous aurez aussi besoin de mettre à jour votre extension_dir dans php.ini pour pointer vers un chemin de ces bibliothèques.

Le DAS Relationnel est écrit en PHP. Vous devrez mettre à jour votre include_path dans php.ini pour pointer vers un répertoire qui contient sdo/DAS/Relational.

Construire SDO sur Linux

Cette section décrit comment construire le noyau SDO et le XML DAS sur Linux. Présentement, 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 présentement fournis :

Nom DASDescription
SDO_DAS_XML Un Service d'Accès de Données XML supportant la lecture/écriture SDOs comme documents XML ou via une adresse Web qui supporte ce genre de choses comme les champs RSS.
SDO_DAS_Relational Un Service d'Accès de Données basé sur PDO supportant la lecture/écriture SDO aux sources 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.

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. Types abstraits et type dérivé.

  2. Types ouverts.

  3. Relations bidirectionnelles.

  4. Type et propriété alias noms.

  5. Propriétés en lecture seule.

  6. XMLHelper/XSDHelper (le XML DAS fournit une multitude de cette fonctionnalité)

  7. TypeHelper (le SDO_DAS_DataFactory fournit cette fonctionnalité)

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.

Le schéma décrit un objet de données compagnie. La compagnie contient un objet de données département et chaque département contient des objets de données employe. Chaque objet de données a un certain nombre de propriétés primitives pour décrire les choses comme le nom, le numéro de série, etc. Finalement, l'objet de données compagnie a aussi une référence non contenue d'un des objets de données employe pour identifier l'un d'entre eux en tant qu'employé du mois (employe_du_mois).

<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>

Le document ci-dessous décrit une seule compagnie, appelée 'MegaCorp', qui contient un seul département, appelé 'Advanced Technologies'. Le département Advanced Technologies contient trois employés. La compagnie employe_du_mois référence le deuxième employé, 'Jane Doe'.

<?xml version="1.0" encoding="UTF-8" ?> 
<compagnie xmlns="compagnieNS" nom="MegaCorp" 
 employe_du_mois="#/departements.0/employes.1">
  <departements nom="Advanced Technologies" endroit="NY" numero="123">
    <employes nom="John Jones" NS="E0001"/>
    <employes nom="Jane Doe" NS="E0003"/>
    <employes nom="Al Smith" NS="E0004" directeur="true"/>
  </departements>
</compagnie>

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

Les exemples suivants assument $compagnie est un objet de données créé provenant du schéma et du 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 suivant récupère la liste des départements (contenant un seul département) et fixe le nom de compagnie à 'Acme'.

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

Exemple 2. Accès via l'index

Les propriétés des objets de données peuvent être accéder en utilisant leur index en utilisant la syntaxe de tableau. L'index est la position où se trouve la définition des propriétés dans le model (dans ce cas, le schéma xml). Nous pouvons voir que le schéma ci-dessus que l'élément departements est la première propriété compagnie définie et l'attribut du nom de la compagnie est la seconde propriété de la compagnie (l'interface SDO ne fait aucune distinction entre les attributs XML et ses éléments). L'exemple suivant récupère la liste des départements (contenant un seul département) et fixe le nom de la compagnie à 'Acme'.

<?php
  $departements
= $compagnie[0];
  
$compagnie[1] = 'Acme';
?>

Exemple 3. Itération d'Objet de Données

Nous pouvons effectuer une itération sur les propriétés d'un objet de données en utilisant un foreach. L'exemple suivant itère sur les propriétés de la compagnie; nom, departements et employe_du_mois.

<?php
  
foreach ($compagnie as $nom => $valeur) {
    
// ...
  
}
?>

Pour la première itération, $nom sera 'nom' et $valeur sera 'Acme'. Pour la seconde itération, $nom sera 'departements' et $value sera un SDO_List (parce que departements est une propriété qui contient plusieurs valeurs (dont l'état est maxOccurs="unbounded" dans ce schéma)) contenant un seul objet de données de type DepartementType. Pour la troisième itération, $nom sera 'employe_du_mois' et $valeur sera un objet de données de type EmployeType.

Exemple 4. Itération de Propriété de plusieurs valeurs

Les Propriétés de plusieurs valeurs peuvent utiliser une itération avec un foreach. L'exemple suivant itère sur les départements des compagnies.

<?php
  
foreach ($compagnie->departements as $departement) {
    
// ...
  
}
?>

Chaque itération assignera le prochain département dans la liste de variable $departement.

Exemple 5. Accès à un Élément de plusieurs valeurs

Nous pouvons accéder à un élément individuel des propriétés de plusieurs valeurs en utilisant une syntaxe de tableau. L'exemple suivant accède le premier département dans la compagnie.

<?php
  $ad_tech_dept
= $compagnie->departements[0];
?>

Exemple 6. Accès aux Propriétés Imbriquées

Nous pouvons accéder à une propriété imbriquée pour naviguer dans la structure d'objet de données. L'exemple suivant récupère et fixe le nom du premier département.

<?php
  $dept_nom
= $compagnie->departements[0]->nom;
  
$compagnie->departements[0]->nom = 'Emerging Technologies';
?>

Exemple 7. Support Simple XPath

Nous pouvons accéder aux propriétés en utilisant des epxressions simili XPath (un sous-ensemble augmenté de XPath), la plus simple forme sur le nom de la propriété. L'exemple suivant fixe le nom de la compagnie et récupère l'employe_du_mois.

<?php
  $compagnie
['nom'] = 'UltraCorp';
  
$edm = $compagnie['employe_du_mois'];
?>

Exemple 8. Support Simple XPath

Nous pouvons utiliser l'accès aux tableaux chaînés pour naviguer parmi la structure de l'objet de données. L'exemple suivant récupère et fixe le nom du premier département.

<?php
  $dept_nom
= $compagnie['departements'][0]['nom'];
  
$compagnie['departements'][0]['nom'] = 'Emerging Technologies';
?>

Exemple 9. Navigation XPath

Nous pouvons utiliser des expressions XPath pour naviguer parmi la structure de l'objet de données. Deux formes d'indexation dans les propriétés à plusieurs valeurs sont supportées. La première est la syntaxe standard de tableau XPath avec l'indexation démarrant à un, la seconde est une extension SDO à XPath avec un index démarrant à zéro. Les deux exemples suivants récupèrent le second employé de la première liste de département.

<?php
  $jane_doe
= $compagnie["departements[1]/employes[2]"];
  
$jane_doe = $compagnie["departements.0/employes.1"];
?>

Exemple 10. Requête XPath

Nous pouvons utiliser XPath pour effectuer une requête et identifier des parties d'un objet de données basé sur une instance de données. L'exemple suivant récupère le directeur du département 'Advanced Technologies'.

<?php
$ad_tech_dir
=
  
$compagnie["departements[nom=\"Advanced Technologies\"]/employes[directeur=\"true\"]"];
?>

Exemple 11. Création d'objet de données enfant

Un objet de données peut être une classe d'objet pour ses objets de données d'enfant. Un objet de données enfant est automatiquement une partie d'un graphique de données. L'exemple suivant ajoute un nouvel employé au département 'Advanced Technologies'.

<?php
  $ad_tech_dept
= $compagnie["departements[nom=\"Advanced Technologoies\"]"];
  
$new_empl = $ad_tech_dept->createDataObject('employes');
  
$new_empl->nom = 'John Johnson';
  
$new_empl->NS = 'E0005';
  
$new_empl->directeur = false;
?>

Exemple 12. Détruire un objet de données référencé

Nous pouvons utiliser les fonctions isset() et unset() pour vérifier et supprimer les items de l'objet de données.

L'exemple suivant supprime l'"employe_du_mois" de la compagnie. Si cela était une relation contenue alors l'employé serait supprimé de la compagnie (ce n'est probablement pas une bonne idée de mettre à la porte votre meilleur employé chaque mois !), mais puisque c'est une référence non contenue, l'employé qui est référencé restera dans le département de la compagnie, mais ne sera plus accessible à partir de la propriété employe_du_mois.

<?php
  
if (isset($compagnie->employe_du_mois)) {
    unset(
$compagnie->employe_du_mois);
  }
?>

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équenceIndex:NomValeur
00:date1er Mars 2005
1-Mutual of Omaha
2-Wild Kingdom, USA
3-Chère
41:prenomCasy
52:nomFamilleCrocodile
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 13. 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 14. 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 15. 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 16. 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 17. 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)
  
$lettres_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)
  
$lettres_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é)
  
$lettres_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é)
  
$lettres_seq->insert('À l'attention de :', 1);
?>

Exemple 18. 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 présentement 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 19. 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 20. 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

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

  • getPropertyIndex - récupère l'index pour un index de séquence donné

  • getPropertyName - récupère le nom 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

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.

Méthodes

  • __construct - construit un nouvel SDO_Model_ReflectionDataObject.

  • 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 le SDO_Model_Property du parent qui définit la relation contenue de l'objet de données réfléchi

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.

  • 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).

Table des matières
SDO_DAS_ChangeSummary::beginLogging --  Commence la journalisation
SDO_DAS_ChangeSummary::endLogging --  Termine la journalisation
SDO_DAS_ChangeSummary::getChangeType --  Récupère le type de changement qui a été fait à l'objet de données
SDO_DAS_ChangeSummary::getChangedDataObjects --  Récupère une liste de d'objets de données qui ont été changés
SDO_DAS_ChangeSummary::getOldContainer --  Récupère un ancien conteneur d'objet de données pour un objet de données supprimé
SDO_DAS_ChangeSummary::getOldValues --  Récupère une liste des anciennes valeurs pour un objet de données
SDO_DAS_ChangeSummary::isLogging --  Vérifie pour voir si la journalisation des changements est activée
SDO_DAS_DataFactory::addPropertyToType --  Ajoute une nouvelle propriété à une définition de type
SDO_DAS_DataFactory::addType --  Ajoute un nouveau type à un modèle
SDO_DAS_DataFactory::getDataFactory --  Récupère l'instance de classe de données
SDO_DAS_DataObject::getChangeSummary --  Récupère le résumé de changement pour un objet de données
SDO_DAS_Setting::getListIndex --  Récupère la liste des index pour une propriété de valeurs multiples changée
SDO_DAS_Setting::getPropertyIndex --  Récupère l'index de propriété pour la propriété changée
SDO_DAS_Setting::getPropertyName --  Récupère le nom de la propriété pour la propriété changée
SDO_DAS_Setting::getValue --  Récupère l'ancienne valeur pour la propriété changée
SDO_DAS_Setting::isSet --  Vérifie pour voir si la propriété était fixée avant d'être modifiée
SDO_DataFactory::create --  Crée un SDO_DataObject
SDO_DataObject::clear --  Détruit les propriétés d'un SDO_DataObject
SDO_DataObject::createDataObject --  Crée un enfant SDO_DataObject
SDO_DataObject::getContainer --  Récupère un conteneur de l'objet de données
SDO_DataObject::getContainmentPropertyName --  Récupère le nom de la propriété du conteneur
SDO_DataObject::getSequence --  Récupère la séquence pour un objet de données
SDO_DataObject::getType --  Récupère le type d'un objet de données
SDO_List::insert --  Insère dans une liste
SDO_Model_Property::getContainingType --  Récupère le SDO_Model_Type qui contient cette propriété
SDO_Model_Property::getDefault --  Récupère la valeur par défaut pour la propriété
SDO_Model_Property::getName --  Récupère le nom de SDO_Model_Property
SDO_Model_Property::getType --  Récupère le SDO_Model_Type de la propriété
SDO_Model_Property::isContainment --  Vérifie pour voir si la propriété définit une relation contenue
SDO_Model_Property::isMany --  Vérifie pour voir si la propriété est de valeurs multiples
SDO_Model_ReflectionDataObject::__construct --  Construit un SDO_Model_ReflectionDataObject
SDO_Model_ReflectionDataObject::getContainmentProperty --  Récupère le SDO_Model_Property du parent qui définit la relation contenue de l'objet de données réfléchi
SDO_Model_ReflectionDataObject::getInstanceProperties --  Récupère les propriétés de l'instance de SDO_DataObject
SDO_Model_ReflectionDataObject::getType --  Récupère le SDO_Model_Type pour SDO_DataObject
SDO_Model_Type::getBaseType --  Récupère le type de base pour le type
SDO_Model_Type::getName --  Récupère le nom du type
SDO_Model_Type::getNamespaceURI --  Récupère l'espace de nom URI pour le type
SDO_Model_Type::getProperties --  Récupère les objets SDO_Model_Property définis pour le type
SDO_Model_Type::getProperty --  Récupère un SDO_Model_Property du type
SDO_Model_Type::isDataType --  Vérifie pour voir si le SDO_Model_Type est un type de données primitive
SDO_Model_Type::isInstance --  Vérifie si un SDO_DataObject est une instance de ce SDO_Model_Type
SDO_Model_Type::isOpenType --  Vérifie pour voir si le type est un type ouvert
SDO_Model_Type::isSequencedType --  Vérifie pour voir si le type est une séquence
SDO_Sequence::getPropertyIndex --  Retourne la propriété index pour la séquence spécifiée
SDO_Sequence::getPropertyName --  Retourne la propriété name pour la séquence spécifiée
SDO_Sequence::insert --  Ajoute dans une séquence
SDO_Sequence::move --  Déplace un item à une autre position de la séquence