Domanda

Negli ultimi aggiornamenti PHP, hanno aggiunto in varie interfacce per consentire un oggetto da trattare come una matrice, come ArrayAccess, Iterator, Countable, ecc

La mia domanda è, sarebbe quindi un senso che il seguente dovrebbe funzionare:

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

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

A partire da ora, PHP genera un errore di tipo accennando, come $array non è tecnicamente un array. Tuttavia, implementa tutte le interfacce che rende sostanzialmente identico ad un array.

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

Logicamente, l'oggetto deve essere in grado di essere utilizzato ovunque un array può essere utilizzato, come si implementa la stessa interfaccia come un array.

Sono confuso nella mia logica, o non ha senso che se un oggetto implementa la stessa interfaccia come un array, dovrebbe essere in grado di essere utilizzato in tutti gli stessi posti?

È stato utile?

Soluzione

  

Sono confuso nella mia logica, o lo fa   senso che se un oggetto   implementa la stessa interfaccia come   matrice, dovrebbe essere in grado di essere utilizzati in   tutti gli stessi luoghi?

Un array è una speciale PHP tipo variabile - non un oggetto - come tale non implementa alcuna interfaccia. ArrayObject è un oggetto vero e proprio che implementa numerose interfacce (Countable, ArrayAccess, ecc) e permette un oggetto di agire come un array in taluni casi (come in un ciclo foreach). Così, mentre essi non implementano le stesse interfacce che a volte si comportano allo stesso.

La soluzione ideale sarebbe per PHP per supportare le firme di funzione multipla:

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

Ma fino a quando non ottenere che (se mai avessimo che) dovrete semplicemente per controllare i tipi di variabili al di fuori della definizione della funzione:

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!');
 }
}

Oppure provate a fare array-roba tipo con l'argomento $array e gestire eventuali avvisi / errori che useArray potrebbe generare.

Altri suggerimenti

Il tipo di hinting sta dichiarando la sua di tipo "serie", ma il vostro passaggio in un "ArrayObj"

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

Quindi sì la sua intenzione di lamentarsi.

  

Sono confuso nella mia logica, o lo fa   senso che se un oggetto   implementa la stessa interfaccia come   matrice, dovrebbe essere in grado di essere utilizzati in   tutti gli stessi luoghi?

Se l'oggetto implementa la stessa interfaccia un'altra classe, sì è possibile usarli in modo intercambiabile, ma ancora valido per il compilatore a lamentarsi il tipo di hinting, dal momento che la sua non è dello stesso tipo.

Il fatto che due oggetti implementano la stessa interfaccia non significa che siano dello stesso tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top