tabla precedencia operadores operador logico expresiones asignacion aritmeticos php operator-overloading

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



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"


Parece que no es una característica del lenguaje, mira este bug . Sin embargo, parece que hay un paquete que le permite hacer algún tipo de sobrecarga.


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;