Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #21009 > unrolled thread
| Started by | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| First post | 2016-07-04 10:18 +0200 |
| Last post | 2016-07-04 10:34 +0100 |
| Articles | 14 — 3 participants |
Back to article view | Back to it.comp.www.php
gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-04 10:18 +0200
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-04 17:26 +0200
Re: gestione degli array lacunosa fmassei@gmail.com - 2016-07-04 08:47 -0700
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-04 18:56 +0200
Re: gestione degli array lacunosa fmassei@gmail.com - 2016-07-04 10:52 -0700
Re: gestione degli array lacunosa fmassei@gmail.com - 2016-07-04 20:08 -0700
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-05 11:20 +0200
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-05 11:57 +0200
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-05 02:20 +0200
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-04 12:15 +0200
Re: gestione degli array lacunosa fmassei@gmail.com - 2016-07-04 05:22 -0700
Re: gestione degli array lacunosa alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-07-04 16:26 +0200
Re: gestione degli array lacunosa fmassei@gmail.com - 2016-07-04 07:50 -0700
Re: gestione degli array lacunosa Alessandro Pellizzari <shuriken@amiran.it> - 2016-07-04 10:34 +0100
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-04 10:18 +0200 |
| Subject | gestione degli array lacunosa |
| Message-ID | <nld63r$1b3t$1@gioia.aioe.org> |
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?
[toc] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-04 17:26 +0200 |
| Message-ID | <nldv83$pmh$1@gioia.aioe.org> |
| In reply to | #21009 |
Il 04/07/2016 16:50, fmassei@gmail.com ha scritto: > On Monday, July 4, 2016 at 10:26:17 AM UTC-4, alex wrote: >> L'obiettivo è sapere semplicemente qual'è l'elemento maligno dell'array >> che ho passato alla funzione array_map (rileggere post iniziale). > > Ma "maligno" de che?? Ce l'hai messo te quel valore nell'array! Cosa pensi > doveva succedere? > 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...
[toc] | [prev] | [next] | [standalone]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-07-04 08:47 -0700 |
| Message-ID | <bcb37bb4-03bb-4e6a-8486-73d7d328bb99@googlegroups.com> |
| In reply to | #21010 |
On Monday, July 4, 2016 at 11:27:01 AM UTC-4, alex wrote: > Il 04/07/2016 16:50, fmassei@gmail.com ha scritto: > > On Monday, July 4, 2016 at 10:26:17 AM UTC-4, alex wrote: > >> L'obiettivo è sapere semplicemente qual'è l'elemento maligno dell'array > >> che ho passato alla funzione array_map (rileggere post iniziale). > > > > Ma "maligno" de che?? Ce l'hai messo te quel valore nell'array! Cosa pensi > > doveva succedere? > > > > 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 > oh, mai sei duro, eh! :D Non.è.così.che.funzionano.gli.array.in.PHP. In questo caso specifico, l'array_map itera l'array e chiama la callback passando il valore dell'elemento corrente: se la funzione ha il parametro tipizzato e il tipo non combacia, l'interprete tira un'eccezione di tipo. Per fare quello che vuoi te l'array_map dovrebbe entrare in try-catch ogni ciclo, che sarebbe un'enorme idiozia. Ancora una volta, se vuoi un vettore tipizzato *non* usare un array, non è la struttura che ti serve, fai wrap della SplObjectStorage, così l'interprete può controllare la tipizzazione sugli inserimenti e l'array_map funziona sempre (e sempre senza controllare il tipo). > 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... E dove sarebbero i tipi in un file yaml o sul DB? Questa non aveva il minimo senso.. Ciao!
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-04 18:56 +0200 |
| Message-ID | <nle4g3$12v7$1@gioia.aioe.org> |
| In reply to | #21012 |
Il 04/07/2016 17:47, fmassei@gmail.com ha scritto: > On Monday, July 4, 2016 at 11:27:01 AM UTC-4, alex wrote: >> Il 04/07/2016 16:50, fmassei@gmail.com ha scritto: >>> On Monday, July 4, 2016 at 10:26:17 AM UTC-4, alex wrote: >>>> L'obiettivo è sapere semplicemente qual'è l'elemento maligno dell'array >>>> che ho passato alla funzione array_map (rileggere post iniziale). >>> >>> Ma "maligno" de che?? Ce l'hai messo te quel valore nell'array! Cosa pensi >>> doveva succedere? >>> >> >> 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 >> > > oh, mai sei duro, eh! :D > > Non.è.così.che.funzionano.gli.array.in.PHP. > > In questo caso specifico, l'array_map itera l'array e chiama la callback > passando il valore dell'elemento corrente: se la funzione ha il parametro > tipizzato e il tipo non combacia, l'interprete tira un'eccezione di tipo. Non si può pretendere qualche info in più, vabè :P > Per fare quello che vuoi te l'array_map dovrebbe entrare in try-catch ogni > ciclo, che sarebbe un'enorme idiozia. ...il motivo? > Ancora una volta, se vuoi un vettore tipizzato *non* usare un array, non è > la struttura che ti serve, fai wrap della SplObjectStorage, Cioè creare un decoratore della suddetta classe? O anche ereditare... > così l'interprete > può controllare la tipizzazione sugli inserimenti e l'array_map funziona > sempre (e sempre senza controllare il tipo). > Naturalmente overridando il metodo attach? >> 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... > > E dove sarebbero i tipi in un file yaml o sul DB? Questa non aveva il minimo > 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.
[toc] | [prev] | [next] | [standalone]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-07-04 10:52 -0700 |
| Message-ID | <d1a9a77b-49d8-4eb4-92bc-8eadb241cbb2@googlegroups.com> |
| In reply to | #21015 |
On Monday, July 4, 2016 at 12:56:38 PM UTC-4, alex wrote: > Il 04/07/2016 17:47, fmassei@gmail.com ha scritto: > > Non.è.così.che.funzionano.gli.array.in.PHP. > > Per fare quello che vuoi te l'array_map dovrebbe entrare in try-catch ogni > > ciclo, che sarebbe un'enorme idiozia. > > ...il motivo? > ... è così in ogni linguaggio ... Per entrare in un try/catch devi creare un nuovo contesto, cosa che, non fosse già pesante abbastanza da sola, impedisce in un ciclo for di ottimizzare con clobbering o vettorizzazioni (e/o pipelines se gira compilato, o in JIT). Non è roba di lana caprina, parliamo di ordini di grandezza di differenza nelle performances. > > Ancora una volta, se vuoi un vettore tipizzato *non* usare un array, non è > > la struttura che ti serve, fai wrap della SplObjectStorage, > > Cioè creare un decoratore della suddetta classe? O anche ereditare... > Erediti. Lascia stare i decoratori, ti serve a "compile" time. > >> 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... > > > > E dove sarebbero i tipi in un file yaml o sul DB? Questa non aveva il > > minimo 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!
[toc] | [prev] | [next] | [standalone]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-07-04 20:08 -0700 |
| Message-ID | <74bf132b-d5a4-4177-8e33-c6b672108f9c@googlegroups.com> |
| In reply to | #21018 |
On Monday, July 4, 2016 at 8:20:39 PM UTC-4, alex wrote: > <snip> > Capito il concetto? Che ti devo di', se vuoi averci ragione te la do. Semmai ne riparleremo quando scriverai del codice. Ciao!
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-05 11:20 +0200 |
| Message-ID | <nlfu4c$1iab$1@gioia.aioe.org> |
| In reply to | #21022 |
Il 05/07/2016 05:08, fmassei@gmail.com ha scritto: > On Monday, July 4, 2016 at 8:20:39 PM UTC-4, alex wrote: >> <snip> >> 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'è?
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-05 11:57 +0200 |
| Message-ID | <nlg0an$1lq8$1@gioia.aioe.org> |
| In reply to | #21025 |
Il 05/07/2016 11:20, alex ha scritto:
> Il 05/07/2016 05:08, fmassei@gmail.com ha scritto:
>> On Monday, July 4, 2016 at 8:20:39 PM UTC-4, alex wrote:
>>> <snip>
>>> 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;
}
/...
}
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-05 02:20 +0200 |
| Message-ID | <nleugi$de0$1@gioia.aioe.org> |
| In reply to | #21018 |
Il 04/07/2016 19:52, fmassei@gmail.com ha scritto:
> On Monday, July 4, 2016 at 12:56:38 PM UTC-4, alex wrote:
>> Il 04/07/2016 17:47, fmassei@gmail.com ha scritto:
>>> Non.è.così.che.funzionano.gli.array.in.PHP.
>>> Per fare quello che vuoi te l'array_map dovrebbe entrare in try-catch ogni
>>> ciclo, che sarebbe un'enorme idiozia.
>>
>> ...il motivo?
>>
>
> ... è così in ogni linguaggio ...
> Per entrare in un try/catch devi creare un nuovo contesto, cosa che, non fosse
> già pesante abbastanza da sola, impedisce in un ciclo for di ottimizzare con
> clobbering o vettorizzazioni (e/o pipelines se gira compilato, o in JIT).
> Non è roba di lana caprina, parliamo di ordini di grandezza di differenza
> nelle performances.
>
Cmq sono strutture che quando servono (molto spesso) vanno implementate,
e sempre a carico dello sviluppatore (come se non lavorasse già abbastanza).
Con i moderni computer poi tutto questo calo di prestazioni diventa
sempre più irrisorio.
>> 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.
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?
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-04 12:15 +0200 |
| Message-ID | <nldcvu$1mja$1@gioia.aioe.org> |
| In reply to | #21009 |
Il 04/07/2016 11:34, Alessandro Pellizzari ha scritto:
> On 04/07/2016 09:18, alex wrote:
>
>> 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.
>
> Puoi tornare a usare VisualBasic, se vuoi. Nessuno ti ferma, eh.
>
> VB era a tipizzazione statica e forte.
> PHP è a tipizzazione debole (il 7 la rende opzionalmente forte) e dinamica.
>
> Cosa ti fa pensare di poterli confrontare?
>
Visto la direzione che sta prendendo php, è il caso di farle complete le
cose.
>> 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
>
> Che è corretto.
>
>> Almeno la key dell'elemento non valido ('number') potrebbe essere
>> indicata...
>
> È una closure, non sa niente dell'indice, e array_map fa il suo: chiama
> la funzione con un elemento dell'array.
>
Che avrebbe, oltre al valore, una specifica key, che array_map (non la
closure) dovrebbe conoscere.
> Se sai che la tua struttura dati è dinamica, non forzare il tipo.
> Se non sai se è dinamica, sviluppa in modo difensivo (con un foreach e
> degli if, per esempio).
>
Proprio questo vorrei evitare.
Sarebbe il caso che php inizi a fare dei controlli in modo intrinseco.
Ne conseguirebbe un codice più pulito; è il caso di iniziare a pensarci!!!
> In PHP7 puoi usare try...catch anche con molti tipi di errore (tra cui
> questo, visto che te lo dice anche lui: Uncaught TypeError)
>
E una volta che ho catturato l'errore (che peraltro non è il mio
obiettivo) che me ne faccio?
>> Con la versione 8 di un ipotetico anno 2018 si riusciranno a colmare
>> certe lacune?
>
> Forse se inizi a segnalare i bug agli sviluppatori invece di lamentarti
> semplicemente sui newsgroup, qualche possibilità c'è.
>
Quasi quasi chiedo di entrare nel team, a questo punto :)
[toc] | [prev] | [next] | [standalone]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-07-04 05:22 -0700 |
| Message-ID | <d94f5522-c189-43c7-b32b-653e8738a0b4@googlegroups.com> |
| In reply to | #21011 |
On Monday, July 4, 2016 at 6:15:28 AM UTC-4, alex wrote:
> Il 04/07/2016 11:34, Alessandro Pellizzari ha scritto:
> > On 04/07/2016 09:18, alex wrote:
> >
> >> function test(callable[] $value) {}
> >>
> >> PHP Parse error: syntax error, unexpected '[', expecting variable
> >> (T_VARIABLE)
> >
> > VB era a tipizzazione statica e forte.
> > PHP è a tipizzazione debole (il 7 la rende opzionalmente forte) e dinamica.
> >
>
> Visto la direzione che sta prendendo php, è il caso di farle complete le
> cose.
>
Non ci sono informazioni sul tipo nell'header degli array, i check di tipo
andrebbero fatti a runtime su ogni elemento. A meno di non cambiare tutta
l'implementazione degli array.
> >> 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...
Boh, no, perché? In nessun messaggio d'errore o eccezione c'è nulla di
simile, non vedo perché arrap_map dovrebbe essere diversa.
> > Se sai che la tua struttura dati è dinamica, non forzare il tipo.
> > Se non sai se è dinamica, sviluppa in modo difensivo (con un foreach e
> > degli if, per esempio).
> >
>
> Proprio questo vorrei evitare.
> Sarebbe il caso che php inizi a fare dei controlli in modo intrinseco.
> Ne conseguirebbe un codice più pulito; è il caso di iniziare a pensarci!!!
>
PHP fa i controntrolli specificati negli RFC, se li conosci bene, sennò
beh.. :)
> > In PHP7 puoi usare try...catch anche con molti tipi di errore (tra cui
> > questo, visto che te lo dice anche lui: Uncaught TypeError)
> >
>
> E una volta che ho catturato l'errore (che peraltro non è il mio
> obiettivo) che me ne faccio?
>
Lo rilanci, lo logghi o lo ignori. Che ci fai con le eccezioni di solito?
> >> Con la versione 8 di un ipotetico anno 2018 si riusciranno a colmare
> >> certe lacune?
> >
> > Forse se inizi a segnalare i bug agli sviluppatori invece di lamentarti
> > semplicemente sui newsgroup, qualche possibilità c'è.
> >
>
> Quasi quasi chiedo di entrare nel team, a questo punto :)
>
Non per cattiveria, ma secondo me dovresti studiarti il linguaggio, prima.
Ciao!
[toc] | [prev] | [next] | [standalone]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-07-04 16:26 +0200 |
| Message-ID | <nldrm6$ibk$1@gioia.aioe.org> |
| In reply to | #21017 |
Il 04/07/2016 14:22, fmassei@gmail.com ha scritto:
>> Visto la direzione che sta prendendo php, è il caso di farle complete le
>> cose.
>>
>
> Non ci sono informazioni sul tipo nell'header degli array, i check di tipo
> andrebbero fatti a runtime su ogni elemento. A meno di non cambiare tutta
> l'implementazione degli array.
>
Qualche miglioramento penso che si potrebbe introdurre.
>>>> 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...
>
> Boh, no, perché? In nessun messaggio d'errore o eccezione c'è nulla di
> simile, non vedo perché arrap_map dovrebbe essere diversa.
>
array_map è solo per citare una funzione tra le altre simili.
>>> Se sai che la tua struttura dati è dinamica, non forzare il tipo.
>>> Se non sai se è dinamica, sviluppa in modo difensivo (con un foreach e
>>> degli if, per esempio).
>>>
>>
>> Proprio questo vorrei evitare.
>> Sarebbe il caso che php inizi a fare dei controlli in modo intrinseco.
>> Ne conseguirebbe un codice più pulito; è il caso di iniziare a pensarci!!!
>>
>
> PHP fa i controntrolli specificati negli RFC, se li conosci bene, sennò
> beh.. :)
Come già detto all'inizio, qualche revisione di tanto in tanto...
>
>>> In PHP7 puoi usare try...catch anche con molti tipi di errore (tra cui
>>> questo, visto che te lo dice anche lui: Uncaught TypeError)
>>>
>>
>> E una volta che ho catturato l'errore (che peraltro non è il mio
>> obiettivo) che me ne faccio?
>>
>
> Lo rilanci, lo logghi o lo ignori. Che ci fai con le eccezioni di solito?
>
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.
[toc] | [prev] | [next] | [standalone]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-07-04 07:50 -0700 |
| Message-ID | <525ccf96-beff-415a-90fe-88df9c937a4e@googlegroups.com> |
| In reply to | #21021 |
On Monday, July 4, 2016 at 10:26:17 AM UTC-4, alex wrote: > L'obiettivo è sapere semplicemente qual'è l'elemento maligno dell'array > che ho passato alla funzione array_map (rileggere post iniziale). Ma "maligno" de che?? Ce l'hai messo te quel valore nell'array! Cosa pensi doveva succedere? > Php la offre questa possibilità? > Mi pare di no. Ma possibilità de che?? Un array in PHP non è un vettore tipizzato, punto. Vuoi un vettore tipizzato? Wrappati la SplObjectStorage e c'hai tutti i controlli di tipo che cerchi. > Quindi non mi resta che implementare a mano i soliti controlli, usare > eventuali var_dump, ecc. Direi che ti resta da riguardarti come funzionano i tipi in PHP.. Ciao!
[toc] | [prev] | [next] | [standalone]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2016-07-04 10:34 +0100 |
| Message-ID | <dtuotnF19b2U1@mid.individual.net> |
| In reply to | #21009 |
On 04/07/2016 09:18, alex wrote:
> 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.
Puoi tornare a usare VisualBasic, se vuoi. Nessuno ti ferma, eh.
VB era a tipizzazione statica e forte.
PHP è a tipizzazione debole (il 7 la rende opzionalmente forte) e dinamica.
Cosa ti fa pensare di poterli confrontare?
> 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
Che è corretto.
> Almeno la key dell'elemento non valido ('number') potrebbe essere
> indicata...
È una closure, non sa niente dell'indice, e array_map fa il suo: chiama
la funzione con un elemento dell'array.
Se sai che la tua struttura dati è dinamica, non forzare il tipo.
Se non sai se è dinamica, sviluppa in modo difensivo (con un foreach e
degli if, per esempio).
In PHP7 puoi usare try...catch anche con molti tipi di errore (tra cui
questo, visto che te lo dice anche lui: Uncaught TypeError)
> Con la versione 8 di un ipotetico anno 2018 si riusciranno a colmare
> certe lacune?
Forse se inizi a segnalare i bug agli sviluppatori invece di lamentarti
semplicemente sui newsgroup, qualche possibilità c'è.
Bye.
[toc] | [prev] | [standalone]
Back to top | Article view | it.comp.www.php
csiph-web