Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #21009 > unrolled thread

gestione degli array lacunosa

Started byalex <1j9448a02@lnx159sneakemail.com.invalid>
First post2016-07-04 10:18 +0200
Last post2016-07-04 10:34 +0100
Articles 14 — 3 participants

Back to article view | Back to it.comp.www.php


Contents

  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

#21009 — gestione degli array lacunosa

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-07-04 10:18 +0200
Subjectgestione 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]


#21010

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21012

Fromfmassei@gmail.com
Date2016-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]


#21015

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21018

Fromfmassei@gmail.com
Date2016-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]


#21022

Fromfmassei@gmail.com
Date2016-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]


#21025

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21026

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21024

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21011

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21017

Fromfmassei@gmail.com
Date2016-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]


#21021

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-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]


#21023

Fromfmassei@gmail.com
Date2016-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]


#21014

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2016-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