Newsgroup: it.comp.www.php
Titolo: gestione degli array lacunosa

function test(callable[] $value) {}
 
PHP Parse error:  syntax error, unexpected '[', expecting variable 
(T_VARIABLE)
 
Siamo alla versione 7, ma di array tipizzati nemmeno l'ombra.
VisualBasic c'è li aveva già negli anni 90.
 
Inoltre...
 
class Abc {};
function test(Abc $value) {}
 
$arr = array(new Abc, 'number' => 2, new Abc);
array_map("test", $arr);
 
Fatal error:  Uncaught TypeError: Argument 1 passed to test() must be an 
instance of Abc, integer given
 
Almeno la key dell'elemento non valido ('number') potrebbe essere 
indicata...
 
Con la versione 8 di un ipotetico anno 2018 si riusciranno a colmare 
certe lacune?

 certe lacune?
 
Forse se inizi a segnalare i bug agli sviluppatori invece di lamentarti 
semplicemente sui newsgroup, qualche possibilità c'è.
 
Bye.
 


 
Quasi quasi chiedo di entrare nel team, a questo punto :)
 


 
Non per cattiveria, ma secondo me dovresti studiarti il linguaggio, prima.
 
Ciao!


 
Ripeto la domanda.
Qual'è l'obiettivo?
L'obiettivo è sapere semplicemente qual'è l'elemento maligno dell'array 
che ho passato alla funzione array_map (rileggere post iniziale).
Php la offre questa possibilità?
Mi pare di no.
Quindi non mi resta che implementare a mano i soliti controlli, usare 
eventuali var_dump, ecc.
Pazienza, vedremo se ci saranno novità in future versioni.

 eventuali var_dump, ecc.
 
Direi che ti resta da riguardarti come funzionano i tipi in PHP..
 
Ciao!


 
Potrebbe essere stato anche un mio collega, e per capire subito cosa c'è 
che non va, invece di
 
Fatal error:  Uncaught TypeError: Argument 1 passed to test() must be an 
instance of Abc, integer given
 
sarebbe meglio avere
 
Fatal error:  Uncaught TypeError: Argument 1 (with key: 'number') passed 
to test() must be an instance of Abc, integer given
 
Certo, quello che ho proposto è un esempio di poche righe di codice, 
quindi è facile trovare l'errore, ma se ad esempio l'array viene 
prelevato da un file yaml, un DB, o chissà dove...

 prelevato da un file yaml, un DB, o chissà dove...
 
E dove sarebbero i tipi in un file yaml o sul DB? Questa non aveva il minimo
senso..
 
Ciao!

 senso..
 
Non ci sono appunto, quindi servirebbe conoscere la key (nome del campo 
se si tratta di un DB) per identificare senza troppa fatica qual'è il 
valore non conforme.
 


 
Continuo a non capire. La tua parte di codice PHP che legge decide come
deserializzare, quindi semmai il problema sarebbe lì, e non è certo
instrinseco.
 
Ciao!

 instrinseco.
 
array_map(
     function($str){
         if (!is_string($str)) {
             throw new Exception($str.' non è una stringa');
         }
         // ...
     },
     spyc::yamlLoad('data.yml')
);
 
PHP Fatal error:  Uncaught Exception: 2 non è una stringa
 
Intanto andiamo a vedere cosa c'è nel file data.yml:
primo: uno
secondo: 2
terzo: tre
 
Il problema infatti risiede nel secondo elemento.
Ma se il file yaml, invece di tre entries, ne contenesse centinaia, per 
trovare il *cattivo* (senza che venga indicata la key) sarebbe molto più 
difficile.
Capito il concetto?

 Capito il concetto?
 
Che ti devo di', se vuoi averci ragione te la do. Semmai ne riparleremo quando
scriverai del codice.
 
Ciao!
 


quello che ho scritto cos'è?


cmq per ora ho risolto così
 
class Strings implements \ArrayAccess
{
 
     private $_wrapped;
 
     function offsetSet($k, $v)
     {
         if (!is_string($v)) {
             throw new \Exception(
                 "stringa non valida: $k"
             );
         }
 
         $this->_wrapped[$k] = $v;
     }
 
     /...
 
}