SPL di PHP: le sue interfacce che coinvolgono gli array coprono tutte le proprietà dell'array?
Domanda
Sarebbe possibile scrivere una classe praticamente indistinguibile da un vero array PHP implementando tutte le interfacce SPL necessarie? Manca qualcosa che sarebbe critico?
Vorrei creare un oggetto Array più avanzato, ma voglio assicurarmi di non rompere un'app esistente che utilizza array ovunque se li sostituissi con una classe Array personalizzata.
Soluzione
Gli unici problemi che mi vengono in mente sono le funzioni gettype () e is_array (). Controlla il tuo codice per
gettype($FakeArray) == 'array'
is_array($FakeArray)
Perché sebbene sia possibile utilizzare l'oggetto proprio come un array, verrà comunque identificato come oggetto.
Altri suggerimenti
Oltre ai punti sopra indicati, non saresti in grado di far funzionare i suggerimenti del tipo di array dello spazio utente con le istanze della tua classe. Ad esempio:
<?php
function f(array $a) { /*...*/ }
$ao = new ArrayObject();
f($ao); //error
?>
Output:
Catchable fatal error: Argument 1 passed to f() must be an array, object given
Altre differenze includono l'operatore '+' per le matrici (unione) e il fallimento di tutte le funzioni array_ *
, inclusi gli array_merge
e array_shift comunemente usati
.