Page 1 sur 1

Array de Array dans une class avec ArrayAccess

Posté : 15 mai 2021, 13:22
par Caape
Bonjour.
Dans l'exemple ci dessous, j'ai une class qui implemente ArrayAccess

Je voudrais faire pour $exemple2 qui utilise la class Exemple, la même chose que $exemple1 qui est du type Array, pour ajouter l'age à l'user. Cela ne fonctionne pas avec la class
<?php

class Exemple implements \ArrayAccess
{
    private $container = [];

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // ArrayAccess
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

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

    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

}

$exemple1 = [];
$exemple1['user'] = ['nom' => "Dupont", "prenom" => "Jean"];
$exemple1['user']['age'] = 20;

var_dump($exemple1);
echo "<br><br>";
var_dump($exemple1['user']);

echo "<br><br>";

$exemple2 = new Exemple();
$exemple2['user'] = ['nom' => "Dupont", "prenom" => "Jean"];
$exemple2['user']['age'] = 20;

var_dump($exemple2);
echo "<br><br>";
var_dump($exemple2['user']);
-Résultat-
testforum.php:39: array(1) { 'user' => array(3) { 'nom' => string(6) "Dupont" 'prenom' => string(4) "Jean" 'age' => int(20) } }

testforum.php:41: array(3) { 'nom' => string(6) "Dupont" 'prenom' => string(4) "Jean" 'age' => int(20) }

/testforum.php:48: class Exemple#1 (1) { private $container => array(1) { 'user' => array(2) { 'nom' => string(6) "Dupont" 'prenom' => string(4) "Jean" } } }

testforum.php:50: array(2) { 'nom' => string(6) "Dupont" 'prenom' => string(4) "Jean" }
Comment faire?
Y a-t-il une autre implémentation à faire ?

Je suis un peu perdu.

Merci

Re: Array de Array dans une class avec ArrayAccess

Posté : 22 mai 2021, 11:13
par Bryx
Hello 🖐

Pourquoi, tu ne pars pas sur une classe objet de base vu ton exemple ?
Je trouve que l'utilisation d'une classe avec ArrayAccess devient compliquée surtout avec de l'objet.

Exemple de classe objet de base (simple) :
class Exemple
{
    private $nom;
    private $prenom;
    private $age;

    public function __construct($leNom, $lePrenom, $lAge)
    {
        $this->nom = $leNom;
        $this->prenom = $lePrenom;
        $this->age = $lAge;
    }

    public function getAge()
    {
        return $this->age;
    }
}

Néanmoins, personnellement voici comment je peux obtenir l'âge d'un objet avec le code suivant :

$exemple2 = new Exemple();
$exemple2['user'] = ['nom' => "Dupont", "prenom" => "Jean", "age" => 20];

Puis tu fais un :

var_dump($exemple2['user']['age']);
Normalement, l'erreur que tu avais avec ta classe ne sera plus.
Cependant, je te conseil de passé par la solution objet que j'ai donné en début ce message surtout pour un débutant.

Fais-moi savoir si tu as résolu ton problème,
Belle journée :D

Re: Array de Array dans une class avec ArrayAccess

Posté : 23 mai 2021, 18:06
par Caape
Bonjour
Merci pour la réponse

Je suis en train de refaire un gros site en le passant en POO.
Pour cela, je m'inspire d'un framework existant Silex de symfony qu'un collègue a utilisé.
Je me demandais comment ça pouvait utiliser des $app->quelquechose(); et des $app['autrechose']();
j'ai trouvais ça vraiment pratique de pouvoir sauvegarder pleins de choses comme si c'était un tableau mais de pouvoir utiliser des méthodes objets pour l'application en elle même.

Mais dans ma recherche, je ne comprends pas pourquoi le getter fonctionne mais pas le setter quand on fait l'accès à un tableau à plusieurs dimensions.

Le code ci dessus n'est la que pour l'exemple et les tests.

Depuis, j'avance sur le dev un peu tous les soirs et je m'aperçois ne pas utiliser les $app['klkchose']. A la place, je déclare des "public $klkchse;" dans ma classe.
mais je ne suis que sur le dev du "Framework". D'autres fonctionnalités pour le site à proprement parlé ne me permettront plus de créer des déclarations dans la classe Application.
Dans le framework silex, il n'y a pas non plus de tableau mais a la place, des $app['truc.machin.bidule"] pour simuler les dimensions d'un tableau. je ne trouve pas ça pratique du tout.
Et reprendre tout le tableau pour modifier juste une variable puis la resauvegarder n'est pas efficace.

Je chercherai une autre solution le moment venu même si celle ci m'aurait bien plus.

Et j'aime bien comprendre le pourquoi du comment, que ça fonctionne ou non.

Cordialement