Upload
lenguyet
View
214
Download
0
Embed Size (px)
Citation preview
PHP OBJET
L3I parcours Miage – Web – Philippe Renevier Gonin 2 / 19 Université Nice Sophia Antipolis
PHP ORIENTÉ OBJET
class Moyenne { // bloc de déclaration de classe
/** Somme des notes obtenues */
private $notes = 0 ;
/** Nombre de notes obtenues */
private $nombreDeNotes = 0 ;
/**
* Ajoute une note à la moyenne
* @param note nouvelle note obtenue
*/
function ajouteNote ($note) {
$this->notes += $note;
$this->nombreDeNotes += 1;
}
/**
* @return moyenne des notes
*/
function calculMoyenne() {
if ($this->nombreDeNotes > 0)
return $this->notes / $this->nombreDeNotes ;
else return 0;
}
}
Déclaration de la classe
pas nécessairement dans un fichier du
même nom
Déclaration de champs de classe
private / protected / public
Déclaration de méthode
private / protected / public
signature = nom de la méthode !
Toute référence à l’instance doit se
faire avec $this
Sinon, c’est une variable locale
Commentaire exploitable par l’IDE ou
Pour la génération de doc.
L3I parcours Miage – Web – Philippe Renevier Gonin 3 / 19 Université Nice Sophia Antipolis
AUTRE EXEMPLE class Panier {
/**
* prix moyen d’un élément du panier
* @var Moyenne
*/
private $moyenne;
// Eléments de notre panier private $items;
// [….] // code coupé, comme le constructeur…
/**
* Ajout de $num articles de type $artnr au panier
* au prix unitaire $prix
* @param $artnr, numéro de l’article – codebarre (int)
* @param $num, le nb de fois que l'article est ajouté
* @param $prix, le prix d'un article
*/ function add_item ($artnr, $num, $prix) { $this->items[$artnr] += $num;
for($i=0; $i< $num; $i++)
$this->moyenne->ajouteNote($prix) ; }
} }
Commentaire exploitable par l’IDE ou
Pour la génération de doc.
Variable locale à la méthode
L3I parcours Miage – Web – Philippe Renevier Gonin 4 / 19 Université Nice Sophia Antipolis
EXEMPLE DE GÉNÉRATION D’API : PHPDOC
http://phpdoc.org/
http://deptinfo.unice.fr/~renevier/exemplesPhp/IHM-
2012/DOC_IHM/
Basé sur des annotations
Utilisable en ligne de commande ou en ligne
L3I parcours Miage – Web – Philippe Renevier Gonin 5 / 19 Université Nice Sophia Antipolis
INITIALISATION ET CRÉATION Initialisation
Pour PHP 5 : utilisez les constructeurs pour les initialisations variables
function magique __construct
Ou function au nom de la classe
Création
$panier = new Panier();
Le constructeur est la fonction qui est appelée automatiquement par la classe lorsque vous créez une nouvelle instance d'une classe a l'aide de l'opérateur new.
Un seul constructeur (nombre de paramètre non discriminant)
Le nom de la classe peut être dans une variable : $panier = new $nomClasse();
Accès aux membres d’une classe
$panier->add_item("diplome", 1, 180); $panier->add_item("semestre 5", 1, 30); print_r($panier ->items);
L3I parcours Miage – Web – Philippe Renevier Gonin 6 / 19 Université Nice Sophia Antipolis
QUELQUES MOTS-CLEFS $this
Objet « courant »
La pseudo-variable $this n'est pas toujours définie ( isset($this) )
Appel statique possiblement implicite (mais avec warning E_STRICT)
extends
Une classe ne peut hériter que d'une seule autre classe
implements
Une classe peut implémenter plusieurs interfaces
::
faire référence aux fonctions et variables d'une classe de base, ou bien d'utiliser des méthodes de classes qui n'ont pas encore d'objets créés (static)
self
référence (statique) à la classe courante
Utilisation avec ::
parent
représente votre classe de base (celle indiqué par extends, dans la déclaration de votre classe)
Utilisation avec ::
__toString( ) : pour conversion en chaine de caractère (return)
L3I parcours Miage – Web – Philippe Renevier Gonin 7 / 19 Université Nice Sophia Antipolis
HÉRITAGE ET CONSTRUCTEUR(S) fonction __construct ou function avec nom de classe
<?php
class LecteurTable {
public function __construct($s="euterpe.unice.fr", $l="visiteur", $p="toctoc", $bd="ihm") {
// …
}
}
class UserManagement extends LecteurTable {
public function UserManagement( ) {
// appel au constructeur « parent » est laissé à la responsabilité du développeur
// i.e. : il faut l’appeler explicitement
parent::__construct(); // appel au constructeur de la classe parent
// ….
}
}
?>
L3I parcours Miage – Web – Philippe Renevier Gonin 8 / 19 Université Nice Sophia Antipolis
STATIC Elements (champs ou méthodes) commun à toutes les instances de la classe
Accessibles sans instance, public si rien n’est précisé
Accès via <nom de classe>::$<nom de champ> ou <nom de classe>:: <methode>( )
<?php
class Bandeau {
public static $map = array(
array("index.php", "connexion"),
array("date.php", "manipulation de dates")
);
}
echo "<a href='".Bandeau::$map[0][0]."'>='".Bandeau::$map[0][1]. " </a>" ;
?>
=> <a href=' index.php' >connexion</a>
L3I parcours Miage – Web – Philippe Renevier Gonin 9 / 19 Université Nice Sophia Antipolis
CONST
DÉFINITION DE CONSTANTE DE CLASSE
Pas d’utilisation du $
Possible pour les classes abstraites et interfaces
Valeur constante, y compris à la déclaration
La valeur ne peut pas être un mot-clef de php class MyClass
{ const constant = 'constant value'; function showConstant() { echo self::constant . "\n"; } }
$variable = MyClass::constant
L3I parcours Miage – Web – Philippe Renevier Gonin 10 / 19 Université Nice Sophia Antipolis
TYPES : LES CHAÎNES DE CARACTÈRES Traitement des variables dans les chaînes : cas des tableaux et des objets
<?php // Ces exemples sont spécifiques à l'utilisation de tableaux dans une chaîne Lorsque vous êtes hors d'une chaîne,
// utilisez toujours des guillemets autour des index de tableau, et n'utilisez pas d'{accolades}. // Affichons toutes les erreurs error_reporting(E_ALL); $fruits = array('fraise' => 'rouge', 'banane' => 'jaune'); // Fonctionne mais notez que cela fonctionne pas comme si cela était hors d'une chaîne echo "Une banane est $fruits[banane]."; // Fonctionne echo "Une banane est {$fruits['banane']}."; // Fonctionne mais PHP cherche une constante appelée banane tel que décrit ci-dessous echo "Une banane est {$fruits[banane]}."; // Ne fonctionne pas, il manque les accolades. Cela donne une erreur d'analyse echo "Une banane est $fruits['banane']."; // Fonctionne echo "Une banane est " . $fruits['banane'] . "."; // Fonctionne echo "Ce carré a un coté de $square->width mètres de large."; // Ne fonctionne pas. width00 pourrait être un champ. echo "Ce carré a un coté de $square->width00 centimètres.";
// Fonctionne echo "Ce carré a un coté de {$square->width}00 centimètres.";
?>
L3I parcours Miage – Web – Philippe Renevier Gonin 11 / 19 Université Nice Sophia Antipolis
FONCTIONS LIÉES AUX OBJETS is_a -- Retourne TRUE si un objet a pour parent une classe donnée
class_exists -- Vérifie qu'une classe a été définie
method_exists -- Vérifie que la méthode existe pour une classe
De l’introspection… get_class_methods -- Retourne les noms des méthodes d'une classe
get_class_vars -- Retourne les valeurs par défaut des propriétés d'une classe
get_class -- Retourne la classe d'un objet
get_declared_classes -- Liste toutes les classes définies
get_declared_interfaces -- Retourne un tableau avec toutes les interfaces déclarées
get_object_vars -- Retourne un tableau associatif des propriétés d'un objet
get_parent_class -- Retourne le nom de la classe d'un objet
is_subclass_of -- Détermine si un objet est une sous-classe
interface_exists -- Vérifie si une interface a été définieun objet ou une classe a une propriété
L3I parcours Miage – Web – Philippe Renevier Gonin 12 / 19 Université Nice Sophia Antipolis
TYPAGE DE PARAMÈTRE DANS LES FONCTIONS
Possible avec des interfaces ou des classes (ou array)
Exemple :
http://deptinfo.unice.fr/~renevier/calendrier/index2.php
Une interface :
<?php
interface CaseGenerateur {
public function genereCase(Calendrier $cal);
public function initialiseCases($auj) ; }
?>
Une classe : Calendrier…
L3I parcours Miage – Web – Philippe Renevier Gonin 13 / 19 Université Nice Sophia Antipolis
ENCAPSULATION PAR DES CLASSES Calendrier
Délégation d’une fonctionnalité à une autre classe
Définition d’un type CaseGenerateur
Utilisation à travers deux méthodes + association à l’initialisation
Remplacement de l’objet instance de CaseGenerateur transparent pour le calendrier (c.f. paramètre dans l’URL)
Chat
Définition d’une classe avec des méthodes pour intégration
importStyle, importScript : pour les entêtes
setIds : pour paramétrer l’intégration dans la page
clearChat, postToChat : pour “alimenter” (écrire)
generateViewChat, generateFormChat, defaultGeneratation : pour générer la discussion
Utilisation « externe de la classe » pour une intégration facilité :
include "<chemin/>chat.inc";
$chat = new MyChat("<chemin/>chat.xml");
$chat->setIds("chat", "chat_input");
$chat->postToChat(); // pour recevoir les messages
// […]
// plus loin dans le corps du document
echo $chat->defaultGeneratation();
Création d’une « façade » : on utilise selon un modèle, l’implémentation nous est inconnu
L3I parcours Miage – Web – Philippe Renevier Gonin 14 / 19 Université Nice Sophia Antipolis
CHARGEMENT DYNAMIQUE
Nécessaire en cas de désérialisation (session)
function __autoload($class_name) {
include $class_name . '.inc'; // ou php
// ou autre chemin, ou plus de cas…
}
Exemple « complexe » :
http://deptinfo.unice.fr/~renevier/exemplesPhp/IHM-2012/includes/autoload.inc.txt
L3I parcours Miage – Web – Philippe Renevier Gonin 15 / 19 Université Nice Sophia Antipolis
GÉNÉRATION D’UN CODE DE CRÉATION
D’UN OBJET OU D’UN TABLEAU
Sous forme d’un code php : var_export($var, true)
Permet d’écrire le code php permettant d’initialiser $var.
on peut « écrire » du php : $code = "\$var = ". var_export($var, true);
Pour les classes, il faut implémenter public static function __set_state($an_array)
$an_array sera un tableau associatif, où les clefs sont les nom des champs de la classe et les valeurs sont les valeurs des ses champs.
L3I parcours Miage – Web – Philippe Renevier Gonin 16 / 19 Université Nice Sophia Antipolis
EXEMPLE : GÉNÉRATION DES RÉPONSES À UNE
REQUÊTE
Recherche par mots clefs
Indexation dans un tableau associatif
Modification de ce tableau => sauvegarder la nouvelle version (c’est du code)
Ex http://deptinfo.unice.fr/~renevier/exemplesPhp/articles/ (“mot de passe”)
Quand on voit un article, on peut ajouter des mots-clefs
Utilise alors http://deptinfo.unice.fr/~renevier/exemplesPhp/articles/inclusion/motcle.inc.txt
Qui écrit dans http://deptinfo.unice.fr/~renevier/exemplesPhp/articles/inclusion/motscles/indexation.inc.txt
Exploité avec http://deptinfo.unice.fr/~renevier/exemplesPhp/articles/inclusion/motscles/affichageRecherche.inc.txt
L3I parcours Miage – Web – Philippe Renevier Gonin 17 / 19 Université Nice Sophia Antipolis
__SET_STATE, EXEMPLE <?php
class Nouvelle {
private $categorie = "";
private $fichier = "";
private $nouveau = false;
/**
* construction a partir d'un chemin complet
* @param string $cheminComplet de type "news/monde/01.news"
*/
public function Nouvelle($cheminComplet = "") {
// […]
}
/**
* methode pour recreer un objet a partir des valeurs des champs de class
* appellee automatiquement par php, c'est une methode "magique"
* @param array $champsDeClasse de type array( "categorie" => "monde", "fichier" => "01.news")
*/
public static function __set_state($champsDeClasse) {
$objet = new Nouvelle();
$objet->categorie = $champsDeClasse['categorie'];
$objet->fichier = $champsDeClasse['fichier'];
// on pourrait faire autrement, on gerant le changement de status a l'exterieur de la classe
$objet->nouveau = false;
return $objet;
}
// […]
} ?>
L3I parcours Miage – Web – Philippe Renevier Gonin 18 / 19 Université Nice Sophia Antipolis
PERSISTANCE D’UN OBJET: SÉRIALISATION
Sous forme d’un binaire (presque string)
C.f. fichier temporaire de session (fichier temporaire)
http://deptinfo.unice.fr/~renevier/exemplesPhp/ser/
string serialize ( mixed $value )
accepte tous les types sauf les ressources
références cycliques dans des tableaux/objets stockées
Pour un Objet (qui n’est pas Serializable) appel à __sleep() exécutée avant toute linéarisation
retourner un tableau avec les noms de toutes les champs qui doivent être linéarisés (mais pas des champs privés de classes parentes)
mixed unserialize ( string $str )
function inversed de serialize
Pour un Objet (qui n’est pas Serializable) appel à __wakeup() Permet de restaurer des ressources
L3I parcours Miage – Web – Philippe Renevier Gonin 19 / 19 Université Nice Sophia Antipolis
INTERFACE LOGICIELLE “SERIALIZABLE”
Interface permettant de personnaliser la linéarisation.
Inibation des méthodes __sleep et __wakeup
Serializable {
/* Méthodes */
abstract public string serialize ( void )
abstract public void unserialize ( string $serialized )
}
Les méthodes font appel aux fonctions serialize et unserialize