Plus précisément, je voudrais créer une classe Array et je voudrais surcharger l'opérateur [].
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;
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
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
ArrayObject
est trop lent pour vous).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"
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. "