codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 2009
-
15 mars 2008 à 17:10
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 2009
-
17 mars 2008 à 01:22
Bonjour à vous :)
J'ai un petit soucis, je me demandais comment définir une variable à la volée dans une classe, sans qu'elle soit publique.
En code étant plus explicite :
class test {
public function essai ($sVarName) {
$this->$sVarName = "est affiché !";
}
}
$o = new test ();
$o->essai ('try');
echo $o->try; // Affiche "est affiché !"
Moi je voudrais que la variable soit protected.
A savoir que je ne peux pas la définir dans "l'en tête" de la classe, puisque c'est l'utilisateur qui choisis le nom de la variable.
Existe-t-il une possibilité ? Si oui comment ?
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 15 mars 2008 à 18:05
Mais le probleme c'est que (je l'ai pas dit tout à l'heure :p) la classe qui utilise la variable crée, est une classe qui étends la classe test. Du coup __get et __set ne fonctionne pas :/ (enfin d'apres mes tests !)
class test {
public function essai ($sVarName) {
$this->$sVarName = "est affiché !";
}
}
class fille extends test {
public function __construct () {
$this->essai ('try');
echo $this->try;
}
}
Mon objectif n'est bien sur pas de mettre des simple strings, mais de pouvoir gerer des objets, dans ce cas, try aurait une instance d'une certaine classe
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 15 mars 2008 à 18:57
Je ne comprends pas ton problème :
De tte manière, le __get() était juste là pour balancer l'exception. Enlève le, ça ne changera pas gd chose : tu n'auras pas ta variable. e principe est juste de stocker tes variables dans un tableau.
Parce que sinon, non, tu ne peux pas changer à la volée la visibilité d'une propriété. Ce serait un beau bordel.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 16 mars 2008 à 00:39
Peut-etre qu'en détaillant plus, tu verra mon probleme :)
Tout d'abord, du code :
abstract class aController {
public function load ($sPath, $sVarName) {
$sPath = str_replace ('.', DIRECTORY_SEPARATOR, $sPath);
if (!file_exists ($sPath))
throw new Exception ('The file does not exists');
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 mars 2008 à 09:21
Bah oui c'est un peu plus long à écrire mais bon...t'es un flemmard!
Tu peux tjrs passer par __call() en la rendant "protected" dans ce cas, mais c'est moins évident à gérer :
<?php
class oControler {
protected $aContrl;
public function load($sVar) {
$this->aContrl[$sVar] = new $sVar;
}
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 16 mars 2008 à 09:23
Ah ben non ça ne marche pas, si je rajoute ça dans le script :
echo $a->A('truc');
La méthode est bien appelée. __call() fonctionne comme __get() ou __set() et ne tient pas compte de l'accessibilité (en tous cas à partir de php5.1 il me semble). C'est logique en fait. Par contre, là, ce n'est accessible qu'en lecture. Tu ne peux pas redéfinir les variables/objets hors du contexte de tes objets.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 16 mars 2008 à 12:40
Donc si j'ai bien compris, c'est pas possible ?
Ahh tu vois que je suis pas un flemmard ;)
T'inquiète, j'avais essayé aussi diverses méthodes, mais aucune ne me convenait. Je vais garder la chose comme elle est actuellement. Je sais pas si c'est un bon point niveau sécurité, mais dès que je trouve une démarche pour la rendre protected, je te fait signe.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 17 mars 2008 à 01:22
Bon je comprends pas.
Apres ton code, je me suis quand même posé la question, j'ai essayé un protected function __get ($sKey) pour retourner une valeur comprise dans un tableau d'objet privé, et ca marche, même dans une classe fille.
Ce qui me perturbe, c'est que j'avais essayé avant, et que ca marchais pas ... J'aurai jamais posé la question sans essayer :p