Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/02/2008, 11h11   #1
Membre du Club
 
Avatar de raoulchatigre
 
Inscription : mars 2004
Messages : 97
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2004
Messages : 97
Points : 54
Points : 54
Par défaut [POO] Interdire la déclaration de variable membre dynamique

Bonjour à tous,

Un petit exemple ?

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
error_reporting (E_ALL | E_STRICT );
 
class lapin
{
    private $carottePreferee = "aucune";
 
    public function __construct($_carottePreferee = "vide")
    {
        $this->carottesPreferees = $_carottePreferee;
    }
 
    public function quelleEstTaCarottPreferee()
    {
        echo( "Ma carotte preferee est : ".$this->carottePreferee ."<br/>");
    }
 
 
}
 
$bugsBunny = new lapin("Celle du voisin !");
$bugsBunny->quelleEstTaCarottPreferee();
 
echo("Alors que : ma carotte preferee est : ".$bugsBunny->carottesPreferees);
?>


L'explication : j'ai fait une erreur de frappe en tapant
Code php :
$this->carottesPreferees = $_carottePreferee;
au lieu de
Code php :
$this->carottePreferee = $_carottePreferee;


C'est peut être un comportement normal de php, mais j'aimerais personellement qu'il m'alerte lorsque je déclare une variable qui n'a pas été déclaré au préalable.

Est-ce possible ?
raoulchatigre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 11h20   #2
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 686
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 686
Points : 5 453
Points : 5 453
Bonjour

Actuellement, tu n'affiches pas toutes les erreurs. E_ALL &~E_NOTICE signifie toutes les erreurs sauf les notices. Or il me semble que ce que tu essayes d'obtenir est jsutement une notice
Essaye de mettre error_reporting à E_ALL simplement.
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 11h24   #3
Membre du Club
 
Avatar de raoulchatigre
 
Inscription : mars 2004
Messages : 97
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2004
Messages : 97
Points : 54
Points : 54
Au temps pour moi :
J'ai pris la mauvaise ligne...
Le comportement est le même avec

Code :
error_reporting (E_ALL | E_STRICT );
En debut de code...
raoulchatigre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 12h43   #4
Membre habitué
 
Inscription : août 2004
Messages : 451
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 451
Points : 137
Points : 137
Envoyer un message via MSN à artotal
tu veux dire que si l'attribut n'existe pas, il n'y a pas de warning à l'appel?
C'est un langage à typage faible, ce comportement est donc normal.
C'est pour ça que dans easyEclipse il surligne les variable similaire, effectivement c'est un problème et la question reste entière ?
__________________
contribution sur phpclasses d'une classe de connection à une base de donnée en php5
http://www.phpclasses.org/browse/file/23687.html
artotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 14h36   #5
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
tu peux ôter "aucune" dans la déclaration de l'attribut, comme ça tu auras au moins une erreur E_NOTICE au moment de la lecture dans la méthode "quelleEstTaCarottPreferee"
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 16h49   #6
Membre du Club
 
Avatar de raoulchatigre
 
Inscription : mars 2004
Messages : 97
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2004
Messages : 97
Points : 54
Points : 54
Citation:
Envoyé par mathieu Voir le message
tu peux ôter "aucune" dans la déclaration de l'attribut, comme ça tu auras au moins une erreur E_NOTICE au moment de la lecture dans la méthode "quelleEstTaCarottPreferee"
Certes, mais ce n'est pas là mon problème, mon problème est que $this->carottesPreferees est déclarée silencieusement. Je conçois que ce fonctionnement existe en local, mais lors de l'accès à une propriété d'un objet, cela me gêne un peu plus.

Je prends mon camarade développeur qui a codé une classe entière en déclarant ses variable à la volée dans le constructeur.
Elles deviennent introuvable avec phpeclipse, elles sont forcément en public, etc... Bref pas d'erreur mais c'est particulièrement désagréable je trouve.

Citation:
Envoyé par artotal Voir le message
tu veux dire que si l'attribut n'existe pas, il n'y a pas de warning à l'appel?
C'est un langage à typage faible, ce comportement est donc normal.
C'est pour ça que dans easyEclipse il surligne les variable similaire, effectivement c'est un problème et la question reste entière ?
J'utilise Eclipse avec PhpEclipse, je ne connais pas EasyEclipse mais cette fonctionnalité est effectivement intéressante.
Sinon je ne vois pas vraiment ce que le typage a à voir là dedans, sauf si "typage faible" implique le fait de "déclaration silencieuse".
(Je parle en des termes créés par moi-même : traducteurs-traduisez )

Je peux toujours me faire une recherche sur tous les $this-> me dirais-vous.
Oui sans doute, mais ne le dites pas J'ENTENDS RIEN DE TOUTE FACON LALALA !!
raoulchatigre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 17h13   #7
Membre habitué
 
Inscription : août 2004
Messages : 451
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 451
Points : 137
Points : 137
Envoyer un message via MSN à artotal
tipage fort == en cas d'erreur sors une exception en java, j2ee...
ce qui a le mérite de prévenir (dans la douleur).
en php il ne dit rien effectivement...
__________________
contribution sur phpclasses d'une classe de connection à une base de donnée en php5
http://www.phpclasses.org/browse/file/23687.html
artotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2008, 18h17   #8
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Salut,

Comme j'ai la même récalcitrance que toi sur les déclarations dynamiques, je fait ceci dans mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
class p
{
public function __get( $prop )
{
// tester la propriete recherchée
// et si pas trouvée, demander à la classe mere, si existante, ou balancer une exception
	switch( $prop )
	{
		case "id":
			return (int)$this->p_id;
		break;
		default:
				try{	return parent::__get( $prop );		}
				catch( Exception $Ex )
				{		throw new Exception("Propriété ".$prop." inconnue dans la classe ".(__CLASS__).".");	}
		break;
	}
}
 
public function __set($prop, $value )
{
// tester la propriete recherchée
// et si pas trouvée, demander à la classe mere, si existante, ou balancer une exception
	switch( $prop )
	{
		case "nom":
			$this->p_nom = (string) $value;
		break;
		default:
				try{	parent::__set( $prop, $value );		}
				catch( Exception $Ex )
				{		throw new Exception("Propriété ".$prop." inconnue dans la classe ".(__CLASS__).".");	}		break;
	}
}
}
Quid des membres public.
Je m'en sert peu souvent en PHP parceque je trouve les getters/setters un peu bizarre dans le comportement.
Mais mon bref si je ne me trompes pas, lors de l'appel d'un membre, PHP regarde les membres public, puis les getters/setters, puis créé le membre si il ne le trouve rien.
Par rapport à mon code, il n'atteindra jamais la derniere possibilité car on lance une exception.

bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h05   #9
Membre du Club
 
Avatar de raoulchatigre
 
Inscription : mars 2004
Messages : 97
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2004
Messages : 97
Points : 54
Points : 54
@keymak:

Merci pour ta solution, j'ai effectivement pensé à utliser __get et __set pour faire cela, mais j'espérais secrètement que PHP pouvait le faire sans moi.
Moralité, on est jamais mieux servi que par soi-même
raoulchatigre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h19.


 
 
 
 
Partenaires

Hébergement Web