Pregunta

En los últimos cambios a PHP, añadieron en varias interfaces para permitir que un objeto a ser tratado como una matriz, tal como ArrayAccess, Iterator, contable, etc.

Mi pregunta es, ¿sería entonces tiene sentido que el siguiente debería funcionar:

function useArray(array $array)
{
    print_r($array);
}

useArray(new ArrayObj(array(1,2,3,4,5));

A partir de ahora, PHP lanza un error de tipo-dando a entender, como $array no es técnicamente una matriz. Sin embargo, se implementa todas las interfaces que lo hace básicamente idéntica a una matriz.

echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2

Lógicamente, el objeto debe ser capaz de ser utilizado en cualquier lugar una matriz se puede utilizar, ya que implementa la misma interfaz como una matriz.

¿Estoy confundido en mi lógica, o hace que tiene sentido que si un objeto implementa la misma interfaz como una matriz, debe ser capaz de ser utilizado en todos los mismos lugares?

¿Fue útil?

Solución

  

¿Estoy confundido en mi lógica, o se   Tiene sentido que si un objeto   implementa la misma interfaz que una   array, que debería ser capaz de ser utilizado en   todos los mismos lugares?

Una array es un PHP tipo variable especial - no un objeto - como tal, no implementa las interfaces. ArrayObject es un objeto de pleno derecho que implementa numerosas interfaces (Countable, ArrayAccess, etc.) y permite a un objeto a actuar como una matriz en ciertos casos (como en un bucle foreach). Así, mientras que no implementan las mismas interfaces que a veces se comportan de la misma.

La solución ideal sería para PHP para apoyar firmas de función múltiple:

function useArray(array $array) { }
function useArray(ArrayObject $array) { }

Pero hasta que conseguir que (si alguna vez eso) que sólo tendrá que comprobar los tipos de variables fuera de la definición de función:

function useArray($array) {
 if (is_array($array) || $array instanceof ArrayObject) {
   // Do some stuff
 } else {
   throw new Exception('I require an array or an array-like structure!');
 }
}

O tratar de hacer las cosas de tipo array con el argumento $array y manejar cualquier advertencias / errores que useArray podría generar.

Otros consejos

Su tipo de insinuación está declarando su tipo de "matriz", pero su fallecimiento en un "ArrayObj"

function useArray(array $array)
...
useArray(new ArrayObj

Así que sí que va a quejarse.

  

¿Estoy confundido en mi lógica, o se   Tiene sentido que si un objeto   implementa la misma interfaz que una   array, que debería ser capaz de ser utilizado en   todos los mismos lugares?

Si el objeto implementa la misma interfaz que otra clase, sí se puede utilizar de forma indistinta, pero sigue siendo válida para el compilador para quejarse de su tipo dando a entender, ya que no es del mismo tipo.

El hecho de que dos objetos implementan la misma interfaz no quiere decir que sean del mismo tipo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top