Específicamente, me gustaría crear una clase Array y me gustaría sobrecargar el operador [].¿Es posible sobrecargar a los operadores en PHP?
Respuesta
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; Me temo que no tengo un caso de uso valiosa sin embargo:
class a extends ArrayObject {
public function offsetSet($i, $v) {
echo 'appending ' . $v;
parent::offsetSet($i, $v);
}
}
$a = new a;
$a[] = 1;
El concepto de PHP de sobrecarga y operadores (ver Overloading, y Array Operators) no es como el concepto de C++. No creo que es posible sobrecargar operadores como +, -, [], etc.
Soluciones Posibles
- Implementar SPL ArrayObject (como se ha mencionado por cbeer).
- Implemente Iterator (si
ArrayObject
es demasiado lento para usted). - Utilice la extensión PECL operator (como se menciona en Benson).
Mejor que el iterador es el SPL ArrayObject, que me he vinculado a continuación. Proporciona toda la gama de funcionalidad de matriz. – cbeer
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é! ¡Usaré la sobrecarga del operador!' Ahora tienes dos problemas ".
-1 la respuesta es simplemente incorrecta, ya que es posible sobrecargar el operador []. Además, es probable que @Chad no esté tratando de resolver un problema con la sobrecarga del operador, pero manteniendo su código ordenado y conciso. – Josiah
Es por eso que dije "Simplemente, no" en lugar de "No". No quería explicar que lo hicieras ampliando ciertas clases de maneras extrañas, porque 1) la sobrecarga del operador es una mala idea incluso cuando la sintaxis para hacerlo es limpia, y 2) la sintaxis para hacerlo en PHP no es suficiente. no limpio – dirtside
¿Necesito repensar mi diseño? Entonces, si quiero hacer una aritmética compleja o aritmética extensa de fechas, ¿tengo que usar llamadas de función en lugar de operadores? Yuck. –
En realidad, la solución óptima es poner en práctica los cuatro métodos de la interfaz ArrayAccess: http://php.net/manual/en/class.arrayaccess.php
Si también desea utilizar el objeto en el contexto de la 'foreach', que tendría que poner en práctica el interfaz 'iterador': http://www.php.net/manual/en/class.iterator.php
+1. Implementar la interfaz ArrayAccess es la ÚNICA respuesta válida al problema del OP. Todos los demás son subóptimos. – hijarian
para una solución simple y limpio en PHP 5.0 o superior, tiene que implementa el ArrayAccess
interface 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"
Esta es la mejor (más precisa) respuesta con respecto a la pregunta OP. Si simplemente desea utilizar el operador '[]' en su objeto, implementar la interfaz 'ArrayAccess' es el camino a seguir. –
- 1. ¿Es posible sobrecargar a los operadores en C?
- 2. ¿Cómo puedo sobrecargar los operadores []?
- 3. ¿Es posible sobrecargar los métodos múltiples de Clojure en Arity?
- 4. ¿Cuál es la forma correcta de sobrecargar a los operadores en clases base abstractas?
- 5. ¿Es posible sobrecargar las mezclas en sass?
- 6. ¿Es posible sobrecargar la función en F #?
- 7. ¿Es posible sobrecargar/importar en Python?
- 8. ¿Es posible anular operadores en Java?
- 9. ¿Es posible sobrecargar la asignación de Python?
- 10. es posible sobrecargar un método final
- 11. ¿Pueden los operadores en Smalltalk estar sobrecargados?
- 12. ¿Cómo hago para sobrecargar a los operadores de C++ para permitir el encadenamiento?
- 13. Salida de Smarty a PHP ¿Es posible?
- 14. Operadores de comparación dinámica en PHP
- 15. ¿Cuál es la forma correcta de sobrecargar los operadores de flujo << >> para mi clase?
- 16. Java - compareTo y operadores
- 17. Mejores prácticas con respecto a iguales: ¿sobrecargar o no sobrecargar?
- 18. ¿Es posible acceder a la variable local externa en PHP?
- 19. ¿Es posible agregar título a los gráficos?
- 20. ¿Qué son los operadores bit a bit?
- 21. ¿Cómo concatenar múltiples operadores ternarios en PHP?
- 22. PHP intellisense en Visual Studio - ¿Es posible?
- 23. En C# 3.0, ¿es posible agregar operadores implícitos a la clase de cadena?
- 24. MongoDB múltiples consultas $ y operadores en PHP
- 25. posible sobrecargar la función en la clase matlab?
- 26. ¿Qué hacen los operadores '& =' y '= &'?
- 27. PHP: ¿Es posible obtener automáticamente todos los datos POST?
- 28. ¿Es posible utilizar los binarios de C++ desde php
- 29. La sobrecarga de los operadores
- 30. ¿Es posible utilizar SplEnum en php 5.2.6?
No solo es una respuesta útil, sino la respuesta correcta. Yo uso ArrayObjects todo el tiempo, y es una forma elegante no solo de anular las matrices, sino de extender todo el modelo de objetos y hacer que PHP patee un trasero serio. – AlexanderJohannesen
No es una respuesta útil o la respuesta correcta. La pregunta es sobre la sobrecarga del operador, no si existe o no una biblioteca con un objeto llamado ArrayObject. – fijiaaron
-1 Usa la interfaz ArrayAccess. No extienda ArrayObject.Estás heredando mucha lógica que probablemente no necesites y, además, la extensión de ArrayObject es impredecible en muchos aspectos, porque hay tanta magia involucrada. – NikiC