Un article de Mmmm!!!

A propos de l'introspection


Ce terme est assez fashion dans la terminologie des informaticiens, qui signifie d'avoir access a des informations sur les variables, fonctions, objects declaré dans le cadre d'un langage. C'est à dire d'avoir la possibilité de prospecté pour connaitre les choses qui sont disponibles.
Exemple:
Avec le langage tcl ont peux connaitre les variables qui ont ete instancié:
>tclsh
% info vars;
tcl_rcFileName tcl_version argv argv0 tcl_interactive tcl_traceCompile auto_oldpath errorCode auto_path errorInfo auto_execs auto_index env tcl_pkgPath tcl_patchLevel argc tcl_traceExec tcl_library tcl_platform
Idem en python , on peut connaitre les fonctionnalités qu'apporte un module:
>>> import sys; 
>>> dir(sys);
['__doc__', '__name__', '__stderr__', '__stdin__', '__stdout__', 'argv', 'builtin_module_names', 'copyright', 'exc_info', 'exc_type', 'exec_prefix', 'executable', 'exit', 'getrefcount', 'hexversion', 'maxint', 'modules', 'path', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'settrace', 'stderr', 'stdin', 'stdout', 'version']

Je crois meme qu'avec Java et les Beans , il y a un mecanisme donnant les fonctionnalites d'un object ( Beans )....
Bon, alors j'en entends deja beugler :
Mouais , mais cela sert a quoi franchement , moi je programme en assembleur et l'introspection je m'en passe aisement.

Je repondrais a cette question car l'informatique evolue vers des langages portables ( ne pas entendre par la que l'on peux les mettre dans une valise :) et que le code peux etre repartie sur un reseau ( heu internet par exemple ). Alors si le langage permet une introspection, on peut mieux prober le systeme que l'on met en place. Remarquez que l'assembleur peut etre introspectif sur ces variables ( registres ) , une introspections bien limité vous en conviendrez :).

les changements introspectifs de PHP4 ...


Dans ma quete introspective sur mon moi profond, cela détint sur mon métier, je m'interresse a l'introspection dans l'informatique PHPéisque. Je m'etais deja penché sur cette problematique au mille facettes ( dont certaine pouvant faire trembler l'ensemble de la justice mondiale sur les sytemes d'information :) dans un autre article " URL a mémoire de FORM ". Cependant , j'ai eu l'occasion faire mes recherches a propos de la recherche du Dedans avec une nouvelle version du langage php : the numero 4.
PHP4 offre justement des fonctionnalités sur ce sujet dont la decouverte me fesait fremisser d'avance.

L'introspection sur les type de base.


Le langage PHP4 permet de connaitre le type de chaques variables apres affectation , grace a gettype. Voici les types possibles
Introspection sur les fonctions

Objet : introspection

Avec mon ami pierre, à la découverte de ces nouvelles possibilités, on avait imaginé de faire une classe qui s'autodocumente.
Ceci grace a quelques nouvelles fonctionnalitées de php . Voici la classe autodocumentation :
class auto_doc {
        function auto_doc() {
                }
        function getdoc() {
        echo "<h3>".get_class($this)."</h3><br>";
                $arr2 = get_class_vars(get_class($this));
                echo "Number of properties ".count($arr2)."<br><ul>";
                while(list($key,$val) = each($arr2)) echo "<li>Properties <b><i> $key </i></b> has value : $val<br>\n";
                echo "</ul>";

                echo "Number of methods ".count($arr2)."<br><ul>";
                $arr = get_class_methods(get_class($this));
                for ($i=0;$i<count($arr);$i++) echo "<li>Methods <b>i>  $arr[$i] </i></b><br>\n";
                echo "</ul>";

                // Si $tutu et $titi n'ont pas de valeur alors il ne sont pas detecte par la fonction get_class_vars
                // Est-ce que php cree une variable des qu'elle doit etre affectée.

                }

        }

Voici le resutat :

auto_doc


Number of properties 0
Number of methods 0

On peut apres faire deriver des objets pouvant s'autodocumenter directement:
class father extends auto_doc  {
        var $pere="daddy";
        var $mere="mom";
        function father() {
		$this-<autodoc();
                }
        function fils() {
                }
        function filles() {
                }
        }
Voici le resultat:

father


Number of properties 2
Number of methods 2

On peut constater que auto_doc et getdoc ne nous interesse pas vraiment , voici la solution pour les éviter:
On peut définir une classe qui va documenter la classe parente:
class father {
        var $pere="daddy";
        var $mere="mom";
        function father() {
                }
        function fils() {
                }
        function filles() {
                }
        }
class auto_doc extends father {
	function auto_doc() {
		$this->father();
		}
        function getdoc() {
        	echo "<h3>Nom de la classe :".get_parent_class($this)."</h3><br>";
                $arr = get_class_methods(get_parent_class ($this));
                echo "<h3>".get_class(get_parent_class($this))."</h3><br>";
                $arr2 = get_class_vars(get_parent_class($this));
                echo "Number of properties ".count($arr2)."<br><ul>";
                while(list($key,$val) = each($arr2)) echo "<li>Properties <b><i> $key </i></b> has value : $val<br>\n";
                echo "</ul>";

                echo "Number of methods ".count($arr2)."<br><ul>";
                $arr = get_class_methods(get_parent_class($this));
                for ($i=0;$i<count($arr);$i++) echo "<li>Methods <b><i>  $arr[$i] </i></b><br>\n";
                echo "</ul>";

                }
        }

$ad=new auto_doc();
$ad->getdoc();

Voici le resultat:

Nom de la classe :father


Number of properties 2
Number of methods 2

Ainsi on n'a plus le probleme de auto_doc et getdoc .

On enfourne des Machine PHP a la série :) La serialisation


serialize et unserialize sont deux fonctions du langage php ( a partir de PHP3.0.5 ) qui permet de mettre sous la forme d'une chaine de caratere tout type php.
Bon regardons ce que cela nous donne: D'abords le source :
class toto {
        var $toto="Toto";
        function toto() {
                }
        function titi() {
                }
        }
class tutu extends toto {
        var $tutu=10;
        function tutu() {
                }
        }
function seria($type,$var) {
        echo " $type: ".serialize($var)."\n";
        }
echo " ";
seria("Chaine ","Toto");
$toto="Toto";
seria("Chaine avec variable ",$toto);
seria("Chaine sans guilemet ",Toto);
seria("Entier ",10);
seria("Booleen TRUE",TRUE);
seria("Booleen FALSE ",FALSE);
seria("Tableau ",Array("toto"=>"10","Titi"=>10));
$t=new toto();
seria("Fonction ",seria);
seria("Methode ",$t->tutu);
seria("Objet ",$t);
$tu=new tutu();
seria("Objet avec heritage ",$tu);
echo "
";
Maintenant le resultat:
Chaine : s:4:"Toto";
Chaine avec variable : s:4:"Toto";
Chaine sans guilemet : s:4:"Toto";
Entier : i:10;
Booleen TRUE: b:1;
Booleen FALSE : b:0;
Tableau : a:2:{s:4:"toto";s:2:"10";s:4:"Titi";i:10;}
Fonction : s:5:"seria";
Methode : N;
Objet : O:4:"toto":1:{s:4:"toto";s:4:"Toto";}
Objet avec heritage : O:4:"tutu":2:{s:4:"toto";s:4:"Toto";s:4:"tutu";i:10;}

N-Analyse des resultats avec la poire et les caouhettes


On pourra remarquer que le langage php affecte automatiquement le type entier ou chaine a une variable ,aisni que la forme generique d'un object serialise est de la forme O:(longueur du nom de l'object):"nom de la l'objet":(profondeur de l'heritage ?):{serialisation des variables membres} On ne peut pas sérialiser une fonction , mais est-il possible de sérialiser une methode d'une fonction. Ben ,non cette fois il ne la transforme pas en chaine de caractere, et indique par N; que c'est inconnu.

Mais a quoi cela peut bien servir doudoudidon


De prime abord, il n'y a pas d'idee qui me vienne a l'esprit; je pense que c'est parce que je n'ai pas l'habitude de serialiser, cependant cet fonctionnalité me seduit.
En reflechissant bien , on peut imaginer que cela peux servir dans la gestion de session , on peut ainsi mettre directement dans un cookie un objet contenant les donnee relative a la session.

Exploitation de cette big bisous de bonne idee


Un cookie mot anglais Signifiant un gateau au chocolat mais en langage informatique qui est largement moins savoureux, c'est une donnée placée sur le poste client à la demande d'un serveur web. Un cookie est caracterisé par son nom, ses données, une date d'expiration, un chemin , un domaine ...etc ... Bon il existe pas mal de documentation sur cette cuisine informatique , allez y voir ... :). documentation sur les cookies avec php

References et liens interressants