Juste pour s'assurer que nous sommes sur la même page, vous avez trois situations.
L'insertion d'une esperluette dans un attribut à l'aide de addAttribute
L'insertion d'une esperluette dans un élément à l'aide de la méthode addChild
L'insertion d'une esperluette dans un élément d'une propriété de surcharge
C'est l'écart entre 2 et 3 qui vous coupe le sifflet. Pourquoi ne addChild pas automatiquement échapper à l'esperluette, tandis que l'ajout d'une propriété à l'objet et définition de sa valeur ne échapper à l'esperluette automatiquement?
Basé sur mon instinct, et encouragés par ce bug, c'était une volonté délibérée de décision de conception. La propriété de surcharge ($a->d = 'Cinq & Six";) est destinée à être la "fuite des arobases pour moi" façon de faire les choses. La méthode addChild méthode est destinée à être "ajouter exactement ce que je vous dis d'ajouter" la méthode. Ainsi, selon le comportement que vous avez besoin, SimpleXML peut vous accueillir.
Disons que vous avez une base de données de texte où tous les esperluettes étaient déjà échappé. L'auto-échappement ne fonctionne pas pour vous ici. C'est l'endroit où vous souhaitez utiliser la méthode addChild. Ou disons que vous nécessaires à l'insertion d'une entité dans votre document
$a = simplexml_load_string('<root></root>');
$a->b = 'This is a non-breaking space ';
$a->addChild('c','This is a non-breaking space ');
print $a->asXML();
C'est ce que le Développeur PHP en ce bug est de défendre des droits. Le comportement de la méthode addChild est destiné à fournir un "moins simple, plus robuste" de soutien lorsque vous en avez besoin pour insérer une esperluette dans le document sans qu'il soit échappé.
Bien sûr, cela ne nous laisse avec la première situation je l'ai mentionné, le addAttribute méthode. Le addAttribute méthode ne coder les esperluettes. Donc, on pourrait aujourd'hui l'état de l'incohérence
- Le addAttriute méthode s'échappe des arobases
- La méthode addElement ne pas coder les esperluettes
- Ce comportement est un peu incohérente. Il est raisonnable que l'utilisateur attend de l' méthodes sur SimpleXML pour échapper à des choses d'une manière cohérente
Cette puis expose le vrai problème avec le SimpleXML api. La situation idéale serait ici
- Propriété de la Surcharge sur un Élément Objets échappe arobases
- Propriété de la Surcharge sur les Objets d'Attribut s'échappe des arobases
- La méthode addElement n'échappe pas à arobases
- le addAttribute méthode ne permet pas de coder les esperluettes
C'est impossible, parce que SimpleXML a pas de concept d'un Attribut de l'Objet. Le addAttribute méthode est (semble être?) la seule façon d'ajouter un attribut. En raison de cela, il s'avère (semble?) SimpleXML en incapables de créer des attributs avec des entités.
Tout cela révèle le paradoxe de **Simple**XML. L'idée derrière cette API est de fournir un moyen simple d'interagir avec quelque chose qui s'avère être complexe.
L'équipe pourrait avoir ajouté un SimpleXMLAttribute Objet, mais c'est une couche supplémentaire de complexité. Si vous souhaitez un multiple de hiérarchie d'objets, l'utilisation DomDoument.
L'équipe pourrait avoir ajouté les drapeaux de la addAttribute et addElement, mais les drapeaux de faire de l'API de plus en plus complexes.
La vraie leçon à tirer ici? Peut-être que c'est aussi simple que cela est difficile et simple et de la date est encore plus difficile. Je ne sais pas si c'était le cas ou pas, mais avec SimpleXML, il semble que quelqu'un a commencé avec une idée simple (utilisation de la propriété, la surcharge de rendre la création de documents XML facile), puis ajustée, comme les problèmes/demandes de fonctionnalités d'origine.
En fait, je pense que la vraie leçon à tirer ici est d'utiliser JSON ;)