Newsgroup: it.comp.www.php
Titolo: Mi sembra un BUG Php

PHP Version 4.3.9
(l'ultima versione disponibile per la mia distribuzione 
centos)
f1();
function f1()
{
   global $a;
   f2();
   var_dump($a);   //NULL??? Dovrebbe essere "hi", no?
}
function f2()
{
   global $a;
   unset($a);
   $a = "hi";
   var_dump($a);   //Stringa "hi", corretto
}

 }
Comportamento corretto. Rimuovi la variabile globale $a e definisci una 
nuova variabile $a con scope locale (ovvero all'interno della funzione).
Ovviamente il discorso cambia se assegnavi direttamente il valore senza 
fare l'unset.
Un consiglio? Cerca di non utilizzare i global! Ti eviti diverse rogne e 
il codice è più leggibile
	Francesco

 nuova variabile $a con scope locale (ovvero all'interno della funzione).
Chi se ne frega di questo o quel metodo. Il punto è: il 
comportamento di php sul codice esposto segue quanto 
previsto dalla manualistica? Se no, allora BUG.

 previsto dalla manualistica? Se no, allora BUG.
vediamo cosa dice 
http://it.php.net/unset
-"unset() distrugge la variabile specificata."
e su questo non abbiamo dubbi
- "Il comportamento di unset() all'interno di una funzione può variare 
in funzione del tipo di variabile che si intende distruggere.
Se si applica unset() ad una variabile globale all'interno di una 
funzione, sarà distrutta solo la variabile locale. Nell'ambiente 
chiamante, la variabile manterrà il medesimo valore che aveva prima 
dell'uso di unset(). "
nel tuo caso, prima di unset, il valore globale di $a non è definito 
(=NULL), infatti se il var_dump lo fai prima di chiamare f2 ottieni lo 
stesso risultato

 previsto dalla manualistica? Se no, allora BUG.
giusto, ma la "manualistica" l'hai letta?
http://www.php.net/unset

 dare fiato alla bocca?
penso di poterti mandare a fare in culo a nome del gruppo.
-- 
Well everybody's heard about the bird 
 Bird is the word
  Don't you know about the bird well everybody knows that the bird is a word
Bird is a word

 previsto dalla manualistica? Se no, allora BUG.
Scusa, hai perfettamente ragione! Il PHP come altri linguaggi, è pieno 
di questi BUG.
Per esempio il seguente codice
$a = 5;
$b = 0;
echo $a / $b;
Torna PHP Warning:  Division by zero in xxx
Eppure tale errore non è riportato nel manuale ufficiale [1]
[1] 
http://it.php.net/manual/en/language.operators.arithmetic.php
	Francesco

 previsto dalla manualistica? Se no, allora BUG.
...io proverei a leggere ATTENTAMENTE il manuale (per quel che riguarda 
'unset' nel tuo caso) prima di dare fiato alla bocca, fare figure di m###a 
ed essere maleducato nascondendoti dietro l'anonimato di una tastiera....mi 
associo a tutto quello che ti ha scritto un paio di post qui sopra motion 
musso.
Creuza 

 'unset' nel tuo caso) prima di dare fiato alla bocca, fare figure di m###a 
E' vero, ho sbagliato, accompagnato all'errore da una 
costruzione schizzofrenica del funzionamento della 
funzione unset.
E' veramente una stronzata che il comando unset, invece 
che "unsettare", qualora usato in una funzione e qualora 
operi su una variabile globalizzata, causi oltre 
all'unset anche l'annullamento della globalizzazione 
della funzione, come se non ci fosse mai stato.
A me pare una emerita stronzata che viola la logicità 
della funzione oltre che negare la possibilità di 
unsettare una variabile globalizzata se non accedendo 
all'array delle variabili globali. Intelligenza e 
logicità avrebbero dovuto portare a realizzare due 
funzioni, unset che faccia sempre e solo unset in ogni 
situazione e poi volendo un'altra funzione per eliminare 
la globalizzazione di una variabile in una funzione.
Comunque ammetto - pur accompagnato dalla stupidità 
logica della funzione unset - di aver sbagliato io non 
ricordando il passaggio così assurdo del manuale.
Recentemente ne ho trovata un'altra di assurdità 
nell'impossibilità di chiudere e riaprire come ci si 
aspetterebbe un link verso un database, ma questa è 
un'altra storia.

 ma questa è un'altra storia.
"Come ci si aspetterebbe" o "come vorresti che fosse"?
Io mi aspetto esattamente il comportamento che ha.
Bye.

 
La logica c'e' ed è corretta. Unset distrugge una variabile, punto; 
opera nello scope interessato oppure, se questa è globale (previa 
dichiarazione global etc...), distrugge la variabile globale.
	Francesco

 e ne stai creando un'altra (locale) con lo stesso nome.
Non è così. Non sai come funziona e per questo non 
capisci che si tratta di una stronzata.
Nel caso citato, unset non distrugge affatto la 
variabile globale come anche io credevo e come ci si 
aspetterebbe bensì chiude la globalizzazione. Un 
arzigogolo illogico da premio oscar. Tanto illogico che 
bensì sia stato spiegato, non sei il solo a non averlo 
compreso.

 dichiarazione global etc...), distrugge la variabile globale.
Non è così. Non sai come funziona e per questo non 


 previsto dalla manualistica? 
Si, segue quanto esposto nel manuale ufficiale:
http://www.php.net/unset
unset() destroys the specified variables.
The behavior of unset() inside of a function can vary depending on what
type of variable you are attempting to destroy.
If a globalized variable is unset() inside of a function, only the
local variable is destroyed. The variable in the calling environment
will retain the same value as before unset() was called.
<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
If you would like to unset() a global variable inside of a function,
you can use the $GLOBALS array to do so:
<?php
function foo() 
{
    unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 Un arzigogolo illogico da premio oscar. 
A me non sembra tanto illogico (se comprendi correttamente il
funzionamento di global) visto anche che tale comportamento e'
descritto chiaramente sul manuale ufficiale.


 importata tramite la keyword global nello scopo locale della funzione.
E ti sembra logico?
La variabile è globalizzata. Se tento di distruggerla 
logica vorrebbe che si distruggesse globalmente.
Tanto che gli ultimi due messaggi di risposta, pur 
dandomi torto, davano per scontato che funzionasse così 
come ho appena scritto che logica vorrebbe, dandomi 
implicitamente piena ragione quando dico che il 
funzionamento assegnato ad unset sulle variabili 
globalizzate è illogico, inaspettato per tutti e 
addirittura incompreso dai più anche dopo che è stato 
spiegato sul newsgroup.
Se una cosa è illogica, non è conoscita e stenta ad 
essere compresa anche quando viene spiegata, c'è 
evidentemente un problema.

 evidentemente un problema.
Dire che e' sconosciuta e' un po' eccessivo. Come gia' scritto, il
manuale ufficiale include un esempio specifico per descrivere il
comportamento da te riscontrato.
Per quanto riguarda l'essere compresa, ritengo che parte del problema
riseda nel modo in cui hai affrontato la discussione. Difficilmente
puoi ottenere un confronto chiaro ed aperto se prendi a male parole la
prima persona che ti risponde.
Per il resto ho gia' ampiamente risposto. Non si tratta di un BUG visto
che, come tu stesso hai scritto, "il comportamento di php sul codice
esposto segue quanto previsto dalla manualistica".
Se ti vengono ulteriori dubbi su comportamenti che ritieni anomali, ti
suggerisco di verificare sul manuale ufficiale se effettivamente si
tratta di un comportamento previsto o meno, e' molto probabile che
otterrai una risposta ai tuoi dubbi in tempi molto piu' brevi.


 }
Del resto si richiederebbe una maggior educazione ma probabilmente 
l'apprendimento di quest'ultima è più difficile della comprensione del 
comportamento di unset.
	Francesco


Avresti ragione, peccato che global assegna una variabile per 
riferimento e facendo l'unset distruggi la variabile che contiene il 
solo riferimento alla variabile "globale" (oppure utilizzando altri 
termini global crea un puntatore alla variabile e con unset rimuovi il 
puntatore, non la variabile).
http://it2.php.net/global
The above script will output "3". By declaring $a and $b global within 
the function, all references to either variable will refer to the global 
version.
http://it2.php.net/manual/en/language.references.unset.php
Unsetting References
When you unset the reference, you just break the binding between 
variable name and variable content. This does not mean that variable 
content will be destroyed.
Seguendo questo ragionamento, ritieni "errato" il comportamento di unset?
	Francesco

 ed essere maleducato nascondendoti dietro l'anonimato di una tastiera....mi 
cosa centra l'anonimato con l'educazione
nick= persona ---> mandalo educatamente a fanculo se ti fa piacere
non cambiare le carte in tavola
non ti piace l'anonimato su internet scollegati


 Bye.
e' corretto il compartamento
piu che altro e' un problema logico della cosa
hai 2 modi per fare la cosa
o ti fai un oggetto oppure usi le variabili globali
non so gusti son gusti

 dare fiato alla bocca?
la manualistica dice che sei un troll, l'ho appena letto
plonk