Page 1 sur 1

Empty et accessibilité

Posté : 31 oct. 2011, 16:09
par xTG
Je me suis retrouvé aujourd'hui sur un problème assez intéressant mais auquel je n'ai pas trouvé de réponse.

Prenons la classe suivante :
class foo{
	private $bar = 1;	
	
	public function __get($name){
		if( isSet($this->$name) )
			return $this->$name;
		else
			return null;
	}
	
	public function isEmpty(){
		if( empty($this->bar) )
			return true;
		return false;
	}
}
Le but est de tester l'attribut bar en vérifiant qu'il n'est pas vide. Pour ce faire j'ai donc codé ceci :
$obj = new foo();
var_dump($obj->bar);
echo $obj->bar . '<br />';
if( empty($obj->bar) )
	echo 'bar = empty';
else
	echo 'bar = !empty';
echo '<br />';
if( $obj->isEmpty() === true )
	echo 'bar = isEmpty()';
else
	echo 'bar = !isEmpty()';
Et dont voici le résultat d’exécution :
int 1
1
bar = empty
bar = !isEmpty()
var_dump() et echo sont donc capable d'accéder à l'attribut bar.
La fonction empty native à PHP en est par contre dans l'incapacité si elle n'est pas utilisée à l'intérieur même de l'objet. 8-|

Quelqu'un saurait-il le pourquoi du comment ?

Re: Empty et accessibilité

Posté : 31 oct. 2011, 17:12
par stealth35
normale t'es en private

Re: Empty et accessibilité

Posté : 31 oct. 2011, 17:43
par xTG
Bah désolé mais j'avoue ne pas comprendre, je renvoie bien l'attribut avec mon getter (cf var_dump() et echo), donc private ou pas on s'en fiche avec ce système.
Donc c'est le retour du getter qui est sensé être testé. Sauf si la fonction empty() ne passe pas par le getter... Mais dans ce cas c'est franchement pas un comportement attendu et ce serait à classer dans les bugs de PHP selon moi.

Pourrais-tu détailler ta réponse ?

Re: Empty et accessibilité

Posté : 01 nov. 2011, 12:30
par moogli
yop,

je pense que ton soucis pourrait être dû à
Note:

empty() ne vérifie que les variables, toute autre chose retournera une erreur d'analyse. En d'autres termes, ce qui suit ne fonctionne pas : empty(trim($name)).
nan ?

parce qu'avec
<?php
class foo{
	private $bar = 1;       
	public function __get($name){
	if( isSet($this->$name) )
		 return $this->$name;
	else
		 return null;
	}

	public function isEmpty(){
		if( empty($this->bar) )
		{
		return true;
		}
		else {
			return false;
		}
	}
}
$obj = new foo();
var_dump($obj->bar);
echo '<br />';
echo 'valeur de bar : '.$obj->bar . '<br />';
$x = $obj->bar;
if( empty($x) )
         echo 'bar est empty';
else
         echo 'bar est pas empty';
echo '<hr />';
if( $obj->isEmpty() === true )
         echo 'bar est vide';
else
         echo 'bar est pas vide';
tu ne peux pas utiliser empty ici car ce n'est pas sur une "variable" mais une méthode de la classe (qui d'ailleurs utilise des fonctions du langage).

pour rejoindre stealth35 si $bar est privée je trouve normale de passer par une méthode pour savoir "ce qu'elle a dans le bide" sinon aucun intérêt de l'avoir en privée ;)

enfin c'est mon avis, c'est pas toujours le meilleur :mrgreen:

@+

Re: Empty et accessibilité

Posté : 01 nov. 2011, 12:38
par xTG
Ah oui j'avais pas lu ce petit encart sur la fonction empty(), cela explique tout. :)
pour rejoindre stealth35 si $bar est privée je trouve normale de passer par une méthode pour savoir "ce qu'elle a dans le bide" sinon aucun intérêt de l'avoir en privée
Bah oui mais du coup on perd la magie du __get() et c'est bien dommage. :(
Je vais donc me faire une fonction de classe testant le empty() mais franchement je trouve ça moche.

Re: Empty et accessibilité

Posté : 01 nov. 2011, 12:43
par moogli
oui mais non, ce qui est privée ne devrait pas être utile en dehors non ?

si t'en a besoin en dehors c'est pas un problème de définition de la porté de la variable au final ?

@+

Re: Empty et accessibilité

Posté : 01 nov. 2011, 14:10
par xTG
Non car dans mon cas j'ai des traitements à faire dans le getter.
Donc soit je fais un getter pour chaque variable, soit je dédouble mes variables private en leur équivalent public mais après traitement. :/

Re: Empty et accessibilité

Posté : 01 nov. 2011, 16:11
par moogli
Hum ça m'a l'air le dawa ton truc ;)

Y a pas moyen de déplacer le empty dans le traitement ?

Sinon oui dans le getter magique par contre si tu veux un bool ce n'est point simple.

Ceci dit Je reste sur mon idée une proprieté / méthode de classe privé n'a pas a intervenir sur un traitement externe à la classes. Les setter / getter n'étant au final qu'un formalisme permettant de filtrer les infos que l'on fournit à la classe et donc être certain qu'elles soient conforme à ce que l'on attend ?

Enfin sinon j'ai rien pigé au truc, ce qui n'est pas exclu ;)

Re: Empty et accessibilité

Posté : 01 nov. 2011, 19:44
par xTG
certain qu'elles soient conforme à ce que l'on attend ?
C'est bien dans ce cadre que je les utilise. ;)
Mais là n'est pas le souci, si je les passe en public le problème restera le même du fait de la fonction __get() qui se mettra en travers de mon chemin.
Donc bienfondé ou non de mon utilisation le problème reste de marbre. :P

Re: Empty et accessibilité

Posté : 03 nov. 2011, 15:13
par stealth35
c'est juste que empty n’appelle pas __get, utilise ArrayObject
class Foo extends ArrayObject
{
    private $bar = 1;

    public function __construct()
    {
        parent::setFlags(parent::ARRAY_AS_PROPS);
    }

    public function offsetExists($offset)
    {
        return isset($this->$offset);
    }
}

$obj = new Foo();
var_dump(empty($obj->bar));

Re: Empty et accessibilité

Posté : 03 nov. 2011, 15:54
par xTG
Hum intéressant ! Cela implique-t-il que toute propriété (public, protected, private) devient accessible de l'extérieur avec ce flag ? (la doc est assez avare sur ces flags)

Re: Empty et accessibilité

Posté : 03 nov. 2011, 17:52
par stealth35
Hum intéressant ! Cela implique-t-il que toute propriété (public, protected, private) devient accessible de l'extérieur avec ce flag ? (la doc est assez avare sur ces flags)
teste tu verras :wink: , après tu peux configurer ça avec offsetGet

Re: Empty et accessibilité

Posté : 03 nov. 2011, 18:39
par xTG
Agha ! Beh je testerai ce weekend dans ce cas. :3

Re: Empty et accessibilité

Posté : 03 nov. 2011, 18:46
par stealth35
Agha ! Beh je testerai ce weekend dans ce cas. :3
il n’accède pas si il est en protected ou private