Morphinof
Messages postés255Date d'inscriptionvendredi 20 avril 2007StatutMembreDernière intervention 9 août 20134 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és2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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és514Date d'inscriptionmercredi 19 mars 2003StatutMembreDerniè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és2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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és514Date d'inscriptionmercredi 19 mars 2003StatutMembreDerniè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és2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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és59Date d'inscriptionlundi 1 décembre 2008StatutMembreDerniè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és2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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és239Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention 3 juin 20101 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.
4 janv. 2011 à 10:48
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 :)
15 déc. 2010 à 00:26
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 :/
14 déc. 2010 à 23:52
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à !
14 déc. 2010 à 23:43
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 ^^
14 déc. 2010 à 23:20
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) ?
13 déc. 2010 à 19:23
"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é.
13 déc. 2010 à 18:52
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 :-)
9 déc. 2010 à 10:32
9 déc. 2010 à 10:15
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.