php - logico - precedencia de operadores aritmeticos
¿Es posible sobrecargar a los operadores en PHP? (6)
El concepto de PHP de sobrecarga y operadores (ver Overloading y Operadores de Array ) no es como el concepto de C ++. No creo que sea posible sobrecargar operadores como +, -, [], etc.
Soluciones posibles
- Implementar SPL ArrayObject (como lo menciona ).
- Implemente Iterator (si
ArrayObject
es demasiado lento para usted). - Use la extensión de operador PECL (como lo menciona Benson ).
Específicamente, me gustaría crear una clase Array y me gustaría sobrecargar el operador [].
En pocas palabras, no; y sugeriría que si crees que necesitas una sobrecarga de estilo C ++, es posible que necesites replantear la solución a tu problema. O tal vez considere no usar PHP.
Parafraseando a Jamie Zawinski, "Tienes un problema y piensas: ''¡Lo sé! ¡Utilizaré la sobrecarga del operador!'' Ahora tienes dos problemas ".
En realidad, la solución óptima es implementar los cuatro métodos de la interfaz ArrayAccess: http://php.net/manual/en/class.arrayaccess.php
Si también desea usar su objeto en el contexto de ''foreach'', tendría que implementar la interfaz ''Iterator'': http://www.php.net/manual/en/class.iterator.php
Para una solución simple y limpia en PHP 5.0+, necesita implementar la interfaz ArrayAccess
y anular las funciones offsetGet, offsetSet, offsetExists y offsetUnset. Ahora puede usar el objeto como una matriz.
Ejemplo:
<?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"
Si está utilizando PHP5 (y debería hacerlo), eche un vistazo a las clases SPL ArrayObject . La documentación no es muy buena, pero creo que si extiendes ArrayObject, tendrías tu matriz "falsa".
EDITAR: Aquí está mi ejemplo rápido; Pero me temo que no tengo un caso de uso valioso:
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo ''appending '' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;