2008-09-28 11 views
6

¿Sería posible escribir una clase que sea prácticamente indistinguible de una matriz de PHP real implementando todas las interfaces SPL necesarias? ¿Están perdiendo algo que sería crítico?SPL de PHP: ¿Sus interfaces que involucran matrices cubren todas las propiedades de la matriz?

Me gustaría construir un objeto Array más avanzado, pero quiero asegurarme de no romper una aplicación existente que usa matrices en todas partes si las sustituyo con una clase Array personalizada.

Respuesta

7

Los únicos problemas que se me ocurren son las funciones gettype() y is_array(). Compruebe su código para

gettype($FakeArray) == 'array' 
is_array($FakeArray) 

Porque aunque se puede utilizar el objeto como una matriz, que todavía se identifica como un objeto.

+2

Incluso entonces, parece que yo podría utilizar la función override_function() para anular esas funciones para dar cuenta de casos adicionales. – Wilco

3

Otras diferencias incluyen el operador '+' para matrices (fusión) y la falla de todas las funciones array_*, incluidas las comúnmente utilizadas array_merge y array_shift.

4

Además de los puntos mencionados anteriormente, no podrá hacer que las sugerencias de tipo de matriz de espacio de usuario funcionen con instancias de su clase. Por ejemplo:

<?php 
function f(array $a) { /*...*/ } 

$ao = new ArrayObject(); 
f($ao); //error 
?> 

Salida:

Catchable fatal error: Argument 1 passed to f() must be an array, object given 
Cuestiones relacionadas