Page 1 sur 1

ArrayAcess et l'auto-incrementation..

Posté : 12 sept. 2007, 19:07
par Shadockou
Salut.
Le code suivant issue d'un exemple du bouquin PHP5 concernant l'auto-incrementation
avec l'interface ArrayAcess.
<?php
class tableau implements ArrayAccess{
	private $tableau = array();
	function offsetExists($index){
		return isset($this->tableau[$index]);
	}
	function &offsetGet($index){
		return $this->tableau[$index];
	}
	function offsetSet($index,$valeur){
		return $this->tableau[$index]=$valeur;
	}
	function offsetUnset($index){
		unset ($this->tableau[$index]);
	}
}
$tab = new tableau();
if(!isset($tab[42])){
	$tab[42]=1;
}
echo ++$tab[42];  //affiche : 2
unset($tab[42]);
?>
M'affiche l'erreur suivante :

Code : Tout sélectionner

Fatal error: Declaration of tableau::offsetGet() must be compatible with that of ArrayAccess::offsetGet()
Ce qui signifie en gros que le renvoie par reference de la function offsetGet n'est pas compatible
avec l'interface ArrayAccess.
Pourtant le livre dit que c'est possible , alors d'ou vient le problème ?
Merci d'avance.

Posté : 12 sept. 2007, 19:40
par Hubert Roksor
Je ne sais pas de quel livre tu parles, mais il se pourrait qu'il s'agisse d'une ancienne édition basée sur une ancienne version de PHP.

À ma connaissance il est impossible de faire fonctionner les opérateurs d'incrémentation/décrémentation via ArrayAccess. Tu peux néanmoins utiliser un opérateur d'assignation tel que
$tab[42] += 1;

Posté : 12 sept. 2007, 19:55
par Shadockou
Eh bien je parle de la troisiéme édition du livre PHP5 avancé, donc qui est assez récente...ce doit
être une coquille alors...

Posté : 27 juin 2009, 12:30
par pastamiam
Bonjour,

Je me permet de faire un up de près de 2 ans plutôt que de poster un autre sujet qui est strictement identique.

Je suis en train de bosser sur PHP 5 avancé d'Eric Despet / Cyril Pierre de Geyer 2ème édition et sur ce code source d'Auto Incrémentation j'ai la même erreur.

Je ne pense pas que ce soit une coquille car le paragraphe indique :
L'auto-incrémentation (et la décrémentation) est un cas particulier. PHP lit la valeur et l'incrémente dans la foulée, sans repasser par la méthode d'affectation[...].
Apparemment le renvoi par référence fonctionnait avec PHP 5.0 mais pas à partir de la 5.1 :
http://bugs.php.net/bug.php?id=34783

Posté : 27 juin 2009, 13:43
par dunbar
Salut,

Encore un argéologue :wink:
Ci tu enlève le & devant le nom de la fonction ca fonctionne :wink:
<?php
class tableau implements ArrayAccess{
    private $tableau = array();
    function offsetExists($index){
        return isset($this->tableau[$index]);
    }
    function offsetGet($index){
        return $this->tableau[$index];
    }
    function offsetSet($index,$valeur){
        return $this->tableau[$index]=$valeur;
    }
    function offsetUnset($index){
        unset ($this->tableau[$index]);
    }
}
$tab = new tableau();
if(!isset($tab[42])){
    $tab[42]=1;
}
echo ++$tab[42];  //affiche : 2
unset($tab[42]);
?>