Détails du sujet

PHP POO [Quiz 2] [Pile 2]

Programmation Orienté Objet en language PHP

Toutes les cartes

Qu'est-ce qu'un Design Pattern?

C'est un patron de conception qui répond à un problème récurrent.

Les interfaces, classes abstraites et traits sont utilisés pour structurer le code de ce patron de conception.


Un peu d'humour

Votre ordinateur peut-il s'enruhmer?

Oui, s'il attrape un virus!


Qu'est ce que le Design Pattern Observer?

C'est un patron de conception qui permet à une classe sujet d'observer certains événements et d'en notifier des objets observateurs qu'elle aura au préalablement attachés afin qu'ils réagissent à l'événement.


Un trait peut-il contenir des attributs statiques?

Oui


Les méthodes statiques sont-elles faites pour agir sur des classes ou des objets?

Sur des classes.


La pseudo-variable $this est-elle disponible dans une méthode statique de classe?

Non car la méthode peut être appelée sans qu'un objet ait été créé.

La méthode statique agit sur des classes et pas sur des objets.

On n'utilise pas $this mais 'self' et 'static' dans une méthode statique.


Le fait de déclarer une méthode ou une propriété statique dans une classe, nous permet-il de pouvoir les utiliser sans instancier  la classe?

Oui


Des propriétés statiques d'une classe sont-elles partageables entre ses classes filles?

Oui


Quel est la différence entre un contexte objet et un contexte statique.

  • Un contexte objet est relatif à un objet. On y utilise le mot-clé $this.
  • Un contexte statique est relatif à une classe. On y utilise les mots-clés self:: et static::

Quels sont les deux synonymes français du 'Late Static Binding'?

  • La résolution statique à la volée.
  • La liaison statique tardive.

Pourquoi avoir introduit depuis PHP 5.3 la résolution statique à la volée (Late Static Binding) avec le mot-clé "static" alors que l'on avait déjà le mot-clé "self"?

Car le mot-clé "self" ne pouvait référencer que la classe active et pas la classe appelante.


Dans un contexte statique quelle est la différence entre le mot-clé "self" et "static"?

  • "self" fait référence à la classe active.
  • "static" fait référence à la classe appelante.

Qu'affichent les lignes finales?
  • A::getSelfName()  affiche 'Hello A'
  • A::getStaticName() affiche 'Hello A'
  • B::getSelfName() affiche 'Hello A'
  • B::getStaticName() affiche 'Hello B' car la méthode fait référence à la classe appelante qui est la classe B. Donc on affiche l'attribut statique de la classe B.

A la désérialisation d'un objet, le constructeur de la classe dont-il est issue est-il appelé?

Non, la désérialisation n'instancie pas une classe et donc ne lance pas le constructeur.

La désérialisation d'un objet transforme une chaine de caractère en objet.

Seule la méthode magique __wakeup est lancée lors de la désérialisation d'un objet.


Est-il possible d'appeler des attributs et méthodes non statiques de manière statique à l'aide du mot-clé 'static'?

Oui, mais il n'est pas conseillé de le faire.


Que lance la ligne finale?

Une erreur, car c'est comme si l'on souhaitait accéder depuis la classe mère A, à l'attribut privé de la classe fille B, avec le mot-clé 'static'.


Pourquoi vouloir créer des méthodes et attributs statiques?

Afin de les utiliser sans avoir besoin de créer un objet.


Interaction entre static, self et parent

Est-il vrai que les mots-clés 'self' et 'parent' transmettent l'information de la classe appelante et ce tant que la résolution de l'appel statique n'est pas complètement résolu?

Vrai


Quelle est la différence entre les 3 mots-clés suivant?

  • parent
  • self
  • static
  • Parent représente la classe parente de la classe dans laquelle il est contenu.
  • Self représente la classe dans laquelle il est contenu.
  • Static représente la classe qui est réellement appelante pendant l'execution du script.

Quel est le but du Design Pattern Factory?

  • Son but est de laisser des classes usine créer les instances à notre place.
  • Permet de créer de manière simplifiée des objets complexes.
  • (a) Instancie la bonne classe dont le nom peut-être compliqué à partir de paramètres simples.
  • (b) Instancie simplement une classe dont le constructeur est trés compliqué.

 


Quel est ce Design Pattern?
  • Design Pattern Factory (en Anglais)
  • Design Pattern Fabrique (en Français)

Les initiales MVC désignent-elles un Design Pattern?

Oui

Le Design Pattern

"Model View Controller"


Quel est le but du Design Pattern MVC?

De séparer l'architecture d'une application en 3 couches logiques afin de faciliter:

  • Le développement en équipe.
  • La gestion du projet.
  • La maintenance.

Par défaut, de quelle visibilité sera une propriété ou une méthode déclarée sans visibilité?

Publique


Quels sont les deux interfaces de la bibliothèque SPL que l'on utilise dans le Design Pattern Observer?

  • SplSubject
  • SplObserver

Donnez un synonyme Anglais et un synonyme Français au Design Pattern Observer.

  • Subject Observer (en Anglais)
  • Sujet Observateur (en Français)

Comment traduire en Français le terme "Design Pattern"?

Patron de Conception


Design Pattern Observer

Quels sont les 3 méthodes de l'interface SplSubject qu'une classe observée doit implémenter?

  • (1) attach
  • (2) detach
  • (3) notify

(1) abstract public void attach ( SplObserver $observer )

(2) abstract public void detach ( SplObserver $observer )

(3) abstract public void notify ( void )


Design Pattern Observer

Que fait la méthode attach() de l'interface SplSubject de la librairie SPL?

Elle permet d'ajouter un SplObserver, c'est à dire une classe observatrice qui implémente l'interface SplObserver.


Design Pattern Observer

Que fait la méthode detach() de l'interface SplSubject de la librairie SPL?

Elle permet de détacher un SplObserver, c'est à dire une classe observatrice qui implémente l'interface SplObserver.


Design Pattern Observer

Que fait la méthode notify() de l'interface SplSubject de la librairie SPL?

Elle notifie toutes les classses observatrices attachées à l'objet observé.


Design Pattern Observer

Quelle est la seule méthode de l'interface SplObserver de la librairie SPL?

  • (1) update

(1) abstract public void update ( SplSubject $subject )


Design Pattern Observer

Que fait la méthode update() de l'interface SplObserver de la librairie SPL?

Elle fait ce que l'on souhaite qu'elle fasse sur l'objet observé.

Elle est située dans l'objet observateur.

C'est la méthode qui est appelée dans la méthode notify() de l'objet observé.


Si une erreur venait à se déclarer dans notre application, pourrait-on utiliser le Design Pattern Observer afin d'enregister l'erreur en BDD et l'envoyer par email?

Oui


Expliquez la méthode notify()?

Le tableau $observers contient le nom de tous les objets observateurs.

La méthode notify() notifie tous les objets observateurs en executant leur méthode update($this).

$this permettra à l'observateur de savoir quelle classe le notifie.


Le Desing Pattern Observer nous permet-il de réduire le couplage applicatif en permettant à chaque objet d'avoir une responsabilité unique?

Oui

Cela permet de découpler l'application en partageant les responsabilités entre les objets.


Qu'est-ce que le couplage applicatif?

C'est une métrique indiquant le niveau d'interaction entre les différents modules (fonctions, objets etc...) d'une application.

Le couplage est fort entre deux objets d'une application s'il y beaucoup d'informations échangées entre eux.


Quand utiliser le Design Pattern Strategy?

Lorsque l'on souhaite qu'un objet puisse effectuer plusieurs traitements différents en fonction d'une variable ou d'un état.

Ce pattern délocalise la partie algorithmique d'une méthode afin de la rendre réutilisable, évitant la duplication de cet algorithme.


Quand utiliser le Design Pattern Singleton?

Lorsque l'on souhaite qu'une classe ne puisse être instancier q'une seule et unique fois.

On doit l'employer uniquement si plusieurs instanciations de la classe provoqueraient un dysfonctionnement.


Quel est en théorie, le Design Pattern utilisé pour une connexion à une base de données?

Le Design Pattern Singleton qui ne permet de donner naissance qu'à une seule instance de classe.


Quel est le principe du Design Pattern Singleton?

Le principe de ce motif de conception est qu'il permet à une classe de ne donner naissance qu'à une et une seule instance. On ne peut obtenir qu'un seul objet de cette classe dans un référentiel donné.


Expliquez ce Design Pattern
Design Pattern Singleton
  • $instance, contiendra l'instance de la classe
  • Le constructeur est privé afin d'empécher une instanciation en dehors de la classe.
  • La méthode __clone() est privée afin d'éviter le clonage.
  • La méthode __wakeup() est finale afin d'éviter la création d'une nouvelle instance mémoire lors de la désérialisation.
  • getInstance(), retourne l'instance actuelle si elle existe, sinon on en crée une.

Soit une classe A qui implémente le Design Pattern Singleton et qui possède donc une méthode publique statique getInstance() qui délivre une seule instance.

Peut-on écrire ces deux lignes à la suite sans générer une erreur?

$a = A::getInstance();

$b = A::getInstance();

Oui, il n'y a pas d'erreur, car $a et $b sont deux références de la même instance de la classe A.

La deuxième ligne ne crée pas une nouvelle instance de la classe A.

 


Quel est le but de l'Injection de Dépendances?

De rendre les classes le plus indépendante possible.

On injecte dans le constructeur de la classe le ou les objets dont elle a besoin pour fonctionner.


Comment faire pour imposer un comportement spécifique à un objet en l'obligeant à implémenter certaines méthodes?

On fait en sorte que la classe dont l'objet est issue implémente une interface.


L'injection de dépendances est-il un Design Pattern?

Oui

Dependency Injection en Anglais.


Les namespaces sont disponibles depuis quelle version de PHP?

5.3


Pourquoi avoir créé les NameSpaces?

Afin d'avoir plusieurs constantes, fonctions et classes de même nom dans une même application.

Puisque les constantes, fonctions et classes sont définies dans un NameSpace elles ne rentreront pas en conflit avec les autres de même nom contenues dans un autre NameSpace.


Comment appeler une fonction ou une classe qui appartient au namespace globale?

Il faut faire précéder son nom d'un backslash (\)


Que faut-il mieux faire lors de l'importation d'une bibliothèque dans notre application afin d'éviter les conflits éventuels des noms de classes, fonctions ou constantes de la bibliothèque avec ceux de l'application?

Isoler la bibliothèque importée dans un NameSpace.