[PHP5.3] EXTENSION DYNAMIQUE D'UN OBJET

DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 - 9 déc. 2010 à 10:15
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 - 4 janv. 2011 à 10:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52584-php5-3-extension-dynamique-d-un-objet

Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
4 janv. 2011 à 10:48
Je crois que j'avais eu quelques problemes avec l'utilisation de call_user_func_array lorsque que voulais faire appel a une methode d'un objet interne a une classe lorsque que j'ai voulu faire une factory method:
class Foo
{
public function __construct(){}

public function a(){ echo 'Coucou !'; }
}

class Bar
{
private $foo;

public function __construct(){ $this->foo = new Foo(); }
}

user_func_array me refusais l'acces a l'objet foo de la classe Bar et j'avais du passer par une eval() pour m'en sortir :s

Je n'ai pas fait le test mais es ce que tu pense que en faisant un truc du style : $t->foo = new Maclasse(); sa marcherai ?

Et plus drole encore as tu teste :

$t = new Test();
$t->foo = new Test();

puis $t->foo->dynamic = function (){} etc. ?

En tout cas tres instructif comme source j'aime beaucoup :)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 déc. 2010 à 00:26
Arf.
Effectivement : Fatal error: Using $this when not in object context in /srv/http/default/index.php on line 14
Une "solution" serait de passer l'objet en argument, comme c'est le cas en Python. Mais ce ne serait pas vraiment viable, puisqu'on ne serait pas dans le contexte de l'objet, ce qui ne laisserait que les méthodes publiques accessibles...
Bon, ben... c'est dommage... Pourquoi j'ai pas cherché à essayer ça dès le début ? En tout cas merci de t'être penché sur la question !

Et puis pour une raison que je n'explique pas, je suis passé à côté de ta source de moteur d'aspect... J'ai pas encore tout compris, parce que je ne connais pas du tout ça. Donc je vais me pencher à mon tour sur ta source qui a l'air chiadée quand même (vu la note et qui a noté, ça laisse présager du très bon !).

Bon et puis prochain challenge : résoudre ce problème de contexte de l'objet que PHP est pas vraiment foutu de comprendre :/
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
14 déc. 2010 à 23:52
Oui, ça fait un bye ! Je suis passé du côté obscure, du Java, JEE & Co. :P

Je pense que le cas de l'include est un peu différent : ce ne sont pas réellement les mêmes mécanismes qui sont mis-en-jeu derrière. En fait, si ça marche le $this avec la fonction anonyme, ça veut dire que y a moyen de faire évoluer le petit moteur d'aspect que j'avais posté l'année dernière : http://www.phpcs.com/codes/MOTEUR-ASPECT-PHP_49329.aspx En fait, ça grosse limitation c'était justement que les aspects n'étaient pas invoqués si l'on utilisait le $this.

J'attends ta confirmation, ça m'intéresse grâve, là !
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
14 déc. 2010 à 23:43
Salut LocalStone, ça fait longtemps aussi que t'es pas venu sur phpCS non ?

Sans tester, je pense ne pas me tromper en disant que oui, ça marche. J'ai déjà pu vérifier qu'il était possible de définir une méthode dans un fichier séparé et de la "rattacher" (faute de verbe plus adapté) à la classe en incluant simplement le fichier depuis n'importe quelle méthode de la classe. Par exemple :
class Test {
private $coucou = 'Nan !!';
public function __construct() {
require 'extension.php';
}
}

fichier extension.php :

public function coucou() {
$this -> coucou = "Coucou";
}

Donc a priori, une méthode définie avec une fonction anonyme, y'a pas de raison... ?
Mais je vais tester incessemment sous peu, histoire de m'assurer que je dis pas de b?tise ^^
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
14 déc. 2010 à 23:20
J'ai pas PHP sous la main, et ça fait longtemps que j'en ai pas fait, d'ailleurs, mais...

Par curiosité, Il se passe quoi si tu fais quelque-chose du genre : test -> dynamic = function() { echo $this -> propertyValue; } ; test -> dynamic();

Est-ce que ça fonctionne (l'utilisation du $this) ?
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
13 déc. 2010 à 19:23
Merci pour la note, Hornet.

"Certes avec des méthodes publiques mais tu as bien précisé que la vocation est didactique."
Je ne comprends pas bien ce que tu veux dire : c'est un défaut d'utiliser des méthodes publiques ? Mais euh lesquelles précisément ?

Pour ce qui est des exemples, euh ouais, c'est toujours mon problème ça... Celui que j'ai donné n'est pas suffisant ? (ok, il est vraiment QUE illustratif lol)
Euh je vais y réfléchir, mais la première idée qui me vient est un système de plugins, un peu plus propre que celui que j'avais déjà posté.
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
13 déc. 2010 à 18:52
Merci, ça donne une bonne illustration des classes en PHP5.3 digne de figurer dans la doc.
Certes avec des méthodes publiques mais tu as bien précisé que la vocation est didactique.
Deux/trois petits exemples en complement et c'est parfait, en tous cas pour moi :-)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2010 à 10:32
Je suis bien d'accord avec toi, sur tous les points... Et je sais pas pourquoi j'ai pas pensé à utiliser method_exists(), probablement la fatigue, l'âge, ou les deux... Merci pour le rappel ^^
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
9 déc. 2010 à 10:15
Le sujet est super intéressant.

Tu peux éviter d'utiliser la réflexion grâce à la fonction method_exists().

C'est un avis personnel mais je pense qu'une méthode abstraite doit être déclarée uniquement si elle est obligatoirement nécessaire. Je pense que tu es d'accord avec moi mais il n'y a rien de plus chiant que d'avoir à écrire une méthode vide.
Rejoignez-nous