Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

PHP : la programmation orientée objet réinventée ?
Un hack permet de manipuler les objets comme en JavaScript

Le , par Idelways, Expert éminent sénior
Visiblement non satisfait par les limitations du modèle objet de PHP, le développeur Dennis Hotson a créé un « Hack » permettant de manipuler les objets comme en JavaScript ou en Ruby.

Son bout de code (plutôt simple) est encore très expérimental et ne fonctionne que sous PHP 5.3.x car il s'appuie essentiellement sur les closures introduites dans la branche 5.3.

Ses implications sont très intéressantes, car il offre des possibilités de méta-programmation et de « monkey-patching » jusque-là non-accessibles comme l'ouverture, la modification et le clonage des classes et l'ajout des méthodes à n'importe quel moment de l'exécution du code.

Selon Dennis, son hack permettrait aussi de limiter la portée des classes et rendre certaines classes temporaires pouvant être débarrassés par le ramasse-miettes.

Son usage ressemblerait à cela :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// Définir une nouvelle classe avec un constructeur et une méthode 
$animal = $class->new() 
  ->def('init', function($t, $name) { 
    $t->name = $name; 
  }) 
  ->def('speak', function($t) { 
    echo "My name is $t->name\n"; 
  }); 
 
// Etendre la classe en ajoutant une autre méthode 
$dog = $animal->extend() 
  ->def('speak', function($t) { 
      echo "My name is $t->name, I have just met you and I love you, SQUIRREL!\n"; 
  }) 
  ->def('bark', function($t) { 
      echo "Woof!\n"; 
  });
Mais son idée soulève des interrogations sur la pertinence de sa démarche.

Certains blogueurs applaudissent mais d'autres qualifient son bout de code de « bricolage » et l'invitent plutôt à changer de langage.

Son code est disponible sur GitHub.

Et vous ?

Qu'en pensez-vous ? « Bricolage » inutile ou « invention » vraiment intéressante ?
Et d'une manière générale, que reprochez-vous au modèle objet de PHP ?

Source : Le Blog de Dennis Hotson


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de palnap palnap - Membre habitué https://www.developpez.com
le 24/09/2010 à 16:24
C'est dingue de voir autant de réactions négatives, moi je trouve que tout ce qui tend à dynamiser un langage est bon à prendre... Après selon le "style" du programmeur, ça peut être utile ou non, mais je pense que le paradigme fonctionnel apporte des choses très intéressantes et il me semble que c'est profitable à tous de voir apparaitre ces notions dans les derniers langages à la mode (.NET avec les closures, Java prochainement, ...)

Quand l'implémentation des closures en Java sera terminée, ça vous piquera autant les yeux?
Avatar de Idelways Idelways - Expert éminent sénior https://www.developpez.com
le 24/09/2010 à 16:36
Bonjour,

Merci d'avoir évoqué l'exemple de Ruby Aurelpitiless.

Un exemple de génération à la volée des méthodes en Rails est sur Active Record:

Pour chaque colonne de la table, l'ORM créé plusieurs méthodes. Pour un modèle Client, il regarde dans le schéma de la base et trouve par exemple une colonne phone_number, alors il ajoute à la classe Client des méthodes client.phone_number pour retourner le numéro de téléphone, la méthode d'assignation client.phone_numer= pour le modifier et client.phone_number? qui retourne True si le client a renseigné son numéro de téléphone.

C'est quand même plus sexy que de faire !empty($client.attributes['phone_number']) ou de créer soit même manuellement des méthodes par colonnes et entretenir tout ce bazar à chaque changement de schémas comme j'en ai vu sur des ORM .NET.

D'ailleurs, sans cela, je ne crois pas que l'application du pattern Convention plutôt que configuration soit aisée, voir même possible sur certains cas.

Par ailleurs, la possibilité d'ouvrir des classes est très puissante, par exemple si une faille critique est détectée dans un framework donné, on peut la patcher soit même soit en corrigeant la ou les méthodes incriminées, ou les désactiver en supprimant la méthode en attendant un correctif.

A partir de là, les applications sont illimitées pour ce genre de manipulations et on peut faire pratiquement tout.

Mais je vous accorde le l'usage du monkey patching soit plus utile dans le cadre du développement d'un framework ou une librairie générique, son usage par le "développeur final" peut être facilement évité.

Cordialement
Idelways
Avatar de fpiat fpiat - Nouveau Candidat au Club https://www.developpez.com
le 24/09/2010 à 17:00
Peut être que la lecture suivante pourra un peu écarter les oeillères http://web.media.mit.edu/~lieber/Lie...elegation.html
Avatar de yann2 yann2 - Membre expérimenté https://www.developpez.com
le 24/09/2010 à 17:13
Citation Envoyé par Idelways  Voir le message
Bonjour,

Merci d'avoir évoqué l'exemple de Ruby Aurelpitiless.

Un exemple de génération à la volée des méthodes en Rails est sur Active Record:

Pour chaque colonne de la table, l'ORM créé plusieurs méthodes. Pour un modèle Client, il regarde dans le schéma de la base et trouve par exemple une colonne phone_number, alors il ajoute à la classe Client des méthodes client.phone_number pour retourner le numéro de téléphone, la méthode d'assignation client.phone_numer= pour le modifier et client.phone_number? qui retourne True si le client a renseigné son numéro de téléphone.

C'est quand même plus sexy que de faire !empty($client.attributes['phone_number']) ou de créer soit même manuellement des méthodes par colonnes et entretenir tout ce bazar à chaque changement de schémas comme j'en ai vu sur des ORM .NET.

D'ailleurs, sans cela, je ne crois pas que l'application du pattern Convention plutôt que configuration soit aisée, voir même possible sur certains cas.

Par ailleurs, la possibilité d'ouvrir des classes est très puissante, par exemple si une faille critique est détectée dans un framework donné, on peut la patcher soit même soit en corrigeant la ou les méthodes incriminées, ou les désactiver en supprimant la méthode en attendant un correctif.

A partir de là, les applications sont illimitées pour ce genre de manipulations et on peut faire pratiquement tout.

Mais je vous accorde le l'usage du monkey patching soit plus utile dans le cadre du développement d'un framework ou une librairie générique, son usage par le "développeur final" peut être facilement évité.

Cordialement
Idelways

Ce genre de choses est effectivement pratique pour construire une structure de données à partir d'une source de données (xml, base de données, ...).

Cependant, cela est déjà faisable [en PHP] sans avoir besoin d'ajouter des méthodes à une classe (ni même avoir besoin de créer une "nouvelle" classe, oui nouvelle entre guillemets parce que si vous regardez le code, on a juste des instances de Obj).

Bref, je n'appelle pas ça "inventer". L'interception d'invocations de méthodes avec la méthode __call existe depuis belle lurette (avant les closures). En fait, l'emploi des closures dans l'exemple ne fait qu'ajouter de l'illisibilité dans le code.

Vous l'aurez compris : pas convaincu - du tout - par ce bout de code. Pour moi, ça reste de la masturbation intellectuel.

Toutefois, l'interception des appels avec la méthode __call restes une possibilité très intéressante.
Avatar de gorgonite gorgonite - Rédacteur/Modérateur https://www.developpez.com
le 24/09/2010 à 18:12
classe vs prototype... éternel débat depuis l'origine de la POO

petite description
Avatar de Firwen Firwen - Membre expérimenté https://www.developpez.com
le 24/09/2010 à 18:43
Oui tout à fait, ce n'est rien d'autre que de la prog par prototypes.

Aprés on aime ou on aime pas...Mais comme toute chose, ça a ses avantages ( consommation mémoire, temps exec ) et ses inconvenients ( sureté de typage boiteuse.. ) .
Avatar de nicorama nicorama - En attente de confirmation mail https://www.developpez.com
le 27/09/2010 à 9:38
Citation Envoyé par berceker united  Voir le message
Je me demande dans quelle circonstance a-t-on besoin d'ajouter des méthodes à la volé dans une classe. Cela me parait tellement loin de la notion d'objet. Ceci n'est pas une critique mais un vrai interrogation de ma part.

Si tu as une application de business intelligence avec plusieurs clients, peut-être qu'un de tes clients voudra un truc spécial.
Il y a des Pattern pour le faire en Java, mais c'est ultra tordu, alors que tu peux faire if myClient.id==xxx then obj.method = function(){...}
La modification du comportement par défaut est l'exception au lieu de faire toute une architecture complexe pour le nominal.

C'est aussi une façon de faire des méthodes abstraites. En Swing on a la même conception avec des Interface (TableModel), des objets AbstractTableModel, et un objet fourni par défaut DefaultTableModel. En Groovy, Javascript ou Rail, tout tiendrait en une seule classe pour le même résultat.
Avatar de susanoo susanoo - Membre du Club https://www.developpez.com
le 27/09/2010 à 13:04
Pourquoi on en parle ?
Avatar de kornik kornik - Nouveau Candidat au Club https://www.developpez.com
le 29/09/2010 à 10:34
Je suis tout à fait d'accord sur le fait qu'un programme écrit avec des méthodes créés dynamiquement devient très difficile à maintenir. Sans oublier que l'on se prive dans ce cas de l'aide du compilateur ou de l'autocomplétion que l'on trouve dans les IDE assez évolués (eclipse,...)

Néanmois, il peut y avoir des domaines où cette possibilité apporte une puissance incomparable au langage. Cela permet des prouesses techniques qui peuvent faire toute la différence en rendant les programmes auto-adaptatifs. Je pense à des domaines comme l'I.A., l'exploration automatique de base de données où de services web.

Mais Php est-il réellement adapté à ce genre de domaines ?
Avatar de LeFix LeFix - Futur Membre du Club https://www.developpez.com
le 07/10/2010 à 10:56
bubulemaster :
La notion d'objet en informatique est la même que la vie courrante.

Je suis complètement d'accord avec çà. Et justement j'observe qu'il y a tout un tas d'objets qui évoluent naturellement, et pas seulement au regard de leur état, mais aussi au regard de leurs capacités (notion d'apprentissage, par exemple). Aussi sur un plan conceptuel, ca ne me gêne pas spécialement qu'un objet puisse se voir adjoindre des méthodes (ca peut aussi faire penser aux tableaux de pointeurs de fonctions en C). Ce qui serait cool du coup, c'est d'ajouter aussi un marqueur sur l'instance (interface ajoutée à la volée ?) histoire d'avoir des appels polymorphes cohérents.
Avatar de camus3 camus3 - Membre éprouvé https://www.developpez.com
le 12/10/2010 à 6:28
La notion d'objet en informatique est la même que la vie courrante.

non puisque justement un objet informatique est par définition totalement abstrait. C'est un piège à mon avis de raisonner comme ça car cela rend plus difficile l'apprentissage de notions si on essaie de comparer la poo à la vie réelle. l'héritage , le polymorphisme , le casting n'existe pas en tant que tel.
Offres d'emploi IT
Consultant sap finance/controlling H/F
Safran - Ile de France - Vélizy-Villacoublay (78140)
Architecte électronique de puissance expérimenté H/F
Safran - Ile de France - Villaroche - Réau
Ingénieur développement fpga (traitement vidéo) H/F
Safran - Ile de France - 100 rue de Paris 91300 MASSY

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Accueil