web-dev-qa-db-fra.com

Est-il possible de surcharger les opérateurs en PHP?

Plus précisément, je voudrais créer une classe Array et je voudrais surcharger l'opérateur [].

62
chadgh

Si vous utilisez PHP5 (et vous devriez l'être), jetez un œil aux classes SPL ArrayObject . La documentation n'est pas trop bonne, mais je pense que si vous étendez ArrayObject, vous auriez votre "faux" tableau.

EDIT: Voici mon exemple rapide; J'ai bien peur de ne pas avoir de cas d'utilisation valable:

class a extends ArrayObject {
    public function offsetSet($i, $v) {
        echo 'appending ' . $v;
        parent::offsetSet($i, $v);
    }
}

$a = new a;
$a[] = 1;
53
cbeer

En fait, la solution optimale consiste à implémenter les quatre méthodes de l'interface ArrayAccess: http://php.net/manual/en/class.arrayaccess.php

Si vous souhaitez également utiliser votre objet dans le contexte de 'foreach', vous devez implémenter l'interface 'Iterator': http://www.php.net/manual/en/class.iterator .php

26
panicz

Le concept de surcharge et d'opérateurs de PHP (voir Surcharge , et Opérateurs de tablea ) n'est pas comme le concept de C++. Je ne pense pas qu'il soit possible de surcharger des opérateurs tels que +, -, [], etc.

Solutions possibles

21
grammar31

Pour une solution simple et propre dans PHP 5.0+, vous devez implémenter l'interface ArrayAccess et remplacer les fonctions offsetGet, offsetSet, offsetExists et offsetUnset. Vous pouvez maintenant utiliser l'objet comme un tableau.

Exemple:

<?php
class A implements ArrayAccess {
    private $data = array();

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

    public function offsetSet($offset, $value) {
        if ($offset === null) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

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

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

$obj = new A;
$obj[] = 'a';
$obj['k'] = 'b';
echo $obj[0], $obj['k']; // print "ab"
8
Fabien Sa

Cela ne semble pas être une caractéristique de la langue, voyez ceci bug . Cependant, il semble qu'il y ait un package qui vous permet de faire une sorte de surcharge.

2
Benson

En termes simples, non; et je suggère que si vous pensez que vous avez besoin d'une surcharge de style C++, vous devrez peut-être repenser la solution à votre problème. Ou peut-être envisagez de ne pas utiliser PHP.

Pour paraphraser Jamie Zawinski, "Vous avez un problème et pensez:" Je sais! Je vais utiliser la surcharge d'opérateur! " Maintenant, vous avez deux problèmes. "

0
dirtside