ArrayAcess et l'auto-incrementation..

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : ArrayAcess et l'auto-incrementation..

par dunbar » 27 juin 2009, 13:43

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]);
?>

par pastamiam » 27 juin 2009, 12:30

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

par Shadockou » 12 sept. 2007, 19:55

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...

par Hubert Roksor » 12 sept. 2007, 19:40

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;

ArrayAcess et l'auto-incrementation..

par Shadockou » 12 sept. 2007, 19:07

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.