Risultati da 1 a 10 di 10

Discussione: PHP /nooob

  1. #1

    Predefinito PHP /nooob

    Ciao a tutti,è un po che non scrivo nel forum ma prendo loccasione che sto cercando di impararmi un po di php per conto mio..
    Sto imparando intanto un po la sintassi e quello che non capisco è la differenza tra AND e && e tra OR e || e un po le priorità degli operatori aritmetici rispetto a quelli logici..
    Ho trovato questo esempio che capisco solo in parte..


    <?php

    $a
    = 11;
    $c = 11;

    if(
    $a += 1 && $c == $a ) echo "true1 $a - $c<br>";
    else echo
    "false1 $a - $c<br>";

    $a = 11;
    $c = 11;

    if(
    $a += 1 AND $c == $a) echo "true2 $a - $c<br>";
    else echo
    "false2 $a - $c<br>";

    ?>


    Da quel che capisco la && ha precendenza rispetto all AND,nel primo esempio PHP non somma 1 alla variabile A per cui risulta vero.
    Nel secondo invece prima somma 1 ad A e poi lo confronta con C,quindi risulta falso.
    Tutto meraviglioso fin qua solo che non capisco bene cosa il programma esegue prima e dopo...
    Se qualcuno ha un po di pazienza per spiegarmi gli sarei grato
    saluti

  2. #2
    Lo Zio
    Data Registrazione
    23-06-08
    Località
    Valle d'Agno
    Messaggi
    2,222

    Predefinito Re: PHP /nooob

    http://www.php.net/manual/it/languag...precedence.php

    Lì trovi l'ordine di precedenza degli operatori in PHP ... Come puoi notare and e or vengono eseguiti per ultimi dando vita a quelle terribili cose che mostrano i tuoi esempi.

    Come mai stai imparando PHP?

    Inviato dal mio Nexus 4 con Tapatalk 2

  3. #3

    Predefinito Re: PHP /nooob

    Citazione Originariamente Scritto da meL.rtcw Visualizza Messaggio
    http://www.php.net/manual/it/languag...precedence.php

    Lì trovi l'ordine di precedenza degli operatori in PHP ... Come puoi notare and e or vengono eseguiti per ultimi dando vita a quelle terribili cose che mostrano i tuoi esempi.

    Come mai stai imparando PHP?

    Inviato dal mio Nexus 4 con Tapatalk 2
    Devo fare un po di pratica ma è molto + chiaro..
    Voglio imparare il php perchè mi è sempre piaciuta la programmazione,sto facendo un corso di webdesign che però è poco "tecnico" quindi cerco di fare un po di pratica..
    In pratica cerco di scappare dal mio attuale (pessimo e mal retribuito ) lavoro sperando di trovare qualcosa nel settore..si vedrà (se qualcuno ha qualche consiglio sul genere è ben accetto..)
    Grazie ancora

  4. #4
    Lo Zio
    Data Registrazione
    23-06-08
    Località
    Valle d'Agno
    Messaggi
    2,222

    Predefinito Re: PHP /nooob

    Capito alla fine sono scelte che si fan fatica a mettere in discussione ... Io mi sarei orientato su altro tipo ruby o python ma vengo da tutt' altro background quindi fa poco testo.

    Inviato dal mio Nexus 4 con Tapatalk 2
    Ultima modifica di meL.rtcw; 22-05-13 alle 18:26:43

  5. #5

    Predefinito Re: PHP /nooob

    Son qua di nuovo con un altra domanda probabilmente stupida
    Veniamo al dunque...sto seguendo una specie di tutorial e non riesco a capire un esempio.



    <?php
    $colori = array('bianco','rosso','verde','blu','giallo','ner o');
    foreach ($colori as &$colore)
    {
    $colore = strtoupper($colore);
    }
    unset($colore);
    foreach ($colori as $colore)
    {
    echo $colore , '<br>';
    }
    ?>

    Il punto è...
    Perchè serve l istruzione "unset()" se larray originale viene modificato?
    Se lo tolgo mi esce la penultima voce dell array 2 volte e mi salta l ultima..
    Sorvoliamo sul fatto che si può fare diversamente e in modo pi semplice vorrei capire perchè si comporta così..Qualcuno sa qualcosa???

  6. #6
    Lo Zio
    Data Registrazione
    23-06-08
    Località
    Valle d'Agno
    Messaggi
    2,222

    Predefinito Re: PHP /nooob

    Sostanzialmente è perché php è un linguaggio fantasioso, diciamo così.

    Normalmente una variabile ha uno scope ben preciso, che in linguaggi C-like è delimitato dalle parentesi graffe. Quindi in qualsiasi altro linguaggio è normale pensare che $colore non sia accessibile (aka non esiste) fuori dal primo o dal secondo ciclo foreach. PHP, invece, se ne frega degli scope.

    Detto questo, per capire bene cosa succede dovresti conoscere il significato di quella & messa prima di $colore. In 2 parole, senza annoiarti troppo, indica che $colore è stata creata "by reference" quindi identifica la posizione in memoria dove $colori[0], $colori[1], ecc... risiedono, permettendo così di cambiare i valori all'interno dell'array.

    Nell'esempio quindi cosa succede? $colore viene creata by reference, viene eseguito il ciclo foreach e alla fine di quest'ultimo si ha che $colore "punta" alla zona di memoria dove sta l'ultimo elemento di $colori. Se fai un echo di $colore hai infatti l'ultimo elemento.
    $colore quindi esiste ancora ed è legata all'ultimo elemento dell'array. Ad ogni iterazione del secondo ciclo foreach viene eseguita una cosa del tipo $colore = $colori[0], $colore = $colori[1], ecc... ed ad ogni iterazione stampi $colore. Però il $colore che stampi non è quello nella posizione specificata da $colori[indice] bensì sempre l'elemento in ultima posizione che ad ogni iterazione si è andati a sovrascrivere. Quindi all'ultima iterazione gli assegni il penultimo valore perché l'ultimo è stato sovrascritto n-1 volte.

    Dovrebbe essere chiaro vedendo l'output del seguente script:

    Codice:
    $colori = array('rosso', 'bianco', 'verde', 'giallo');    
    foreach ($colori as &$colore) {      
        $colore = strtoupper($colore);  
    }    
    echo $colore . '<br>';
    echo json_encode($colori) . '<br>';
    //unset($colore);
    foreach ($colori as $colore)  {      
        echo $colore . ' ' . json_encode($colori) . '<br>';  
    }
    Consiglio: non usare la & se non strettamente necessario (anche se il mio prof di programmazione non sarebbe per niente d'accordo, gh).
    Tip: nel secondo ciclo utilizzando un'altra variabile oppure mettendo la & come nel primo abbiamo un risultato soddisfacente.

  7. #7

    Predefinito Re: PHP /nooob

    Grazie della risposta...ieri ho scritto 2 messaggi che alla fine si son cancellati e mi son rotto quindi scrivo oggi che sono anche un po meno stanco.Se mancano accenti o robe del genere portate pazienza che ho la tastiera in palla e devo far copia incolla anche per mettere un punto di domanda almeno finche mi decido a mandarlo all hp .

    Dunque non son sicuro di aver capito,provo a spiegarmi poi se sbaglio o non mi spiego chiaramente le correzioni sono ben accette.L altro giorno avevo capito da solo che usando un altra variabile o aggiungendo la & il problema si risolveva ma voglio capire bene come si comporta PHP.Tra l altro a forza di pensarci non somn pio sicuro del motivo per cui la & risolve il problema,scriverò quello che ho capito sul tema in fondo al post.
    Premetto che non conosco il comando json_encode() ma presumo serva a stampare il contenuto dell array giusto?

    Allora...alla fine del primo foreach $colore è giallo ed è come se fosse $colori[4] quindi in teoria modificandolo modifico anche il valore dellelemento 4 dell array $colori.
    Se non metto nè unset(colore$) nè la & e cambio il valore di $colore (con il secondo foreach) Php quindi sostituisce lultimo elemento dell array con il nuovo valore di $colore.
    Al penultimo ciclo $colore è verde e quindi lo è anche l ultimo elemento di $colori quindi l ultima iterazione è uguale alla penultima.

    Per quanto riguarda la &:
    alla fine del primo foreach $colore è legata all ultimo elemento di $colori e cambiandone il valore si cambia anche il valore di quest ultimo .Mettendo la & però al primo ciclo del secondo foreach PHP si lega al primo elemento dell array(praticamente lo sostituisce),lasciando invariato l ultimo,e così via con le altre iterazioni.
    Ho capito giusto?A dire il vero l argomento mi è ancora un po confuso ma se ho capito bene probabilmente con un po di pratica ci faccio la mano.

    Poi una curiosità...perchèmel_rtcw dici che è meglio mettere la & il meno possibile?Per evitare che la variabile temporanea che rappresenta i singoli valori dell array (in questo caso $colore) rimanga legata ad un elemento di quest ultimo e in caso ne venga cambiato il contenuto (di $colore) possa cambiare anche l elemento dell array a cui è rimasta legata?Mi faccio le domande e mi riospondo da solo è che non son sicuro di rispondermi giusto vabbè passo argomento.. up!

  8. #8
    Lo Zio
    Data Registrazione
    23-06-08
    Località
    Valle d'Agno
    Messaggi
    2,222

    Predefinito Re: PHP /nooob

    Citazione Originariamente Scritto da Matteo@90 Visualizza Messaggio
    Grazie della risposta...ieri ho scritto 2 messaggi che alla fine si son cancellati e mi son rotto quindi scrivo oggi che sono anche un po meno stanco.Se mancano accenti o robe del genere portate pazienza che ho la tastiera in palla e devo far copia incolla anche per mettere un punto di domanda almeno finche mi decido a mandarlo all hp .

    Dunque non son sicuro di aver capito,provo a spiegarmi poi se sbaglio o non mi spiego chiaramente le correzioni sono ben accette.L altro giorno avevo capito da solo che usando un altra variabile o aggiungendo la & il problema si risolveva ma voglio capire bene come si comporta PHP.Tra l altro a forza di pensarci non somn pio sicuro del motivo per cui la & risolve il problema,scriverò quello che ho capito sul tema in fondo al post.
    Premetto che non conosco il comando json_encode() ma presumo serva a stampare il contenuto dell array giusto?
    json scoprirai più avanti cos'è e a che serve, se non ti stufi prima, gh. Cmq permette di comprimere in una stringa oggetti e array senza fare cicli o altro. Se vuoi dare un'occhiata: http://json.org/

    Citazione Originariamente Scritto da Matteo@90 Visualizza Messaggio
    Allora...alla fine del primo foreach $colore è giallo ed è come se fosse $colori[4] quindi in teoria modificandolo modifico anche il valore dellelemento 4 dell array $colori.
    Se non metto nè unset(colore$) nè la & e cambio il valore di $colore (con il secondo foreach) Php quindi sostituisce lultimo elemento dell array con il nuovo valore di $colore.
    Al penultimo ciclo $colore è verde e quindi lo è anche l ultimo elemento di $colori quindi l ultima iterazione è uguale alla penultima.
    Direi che ci siamo.

    Citazione Originariamente Scritto da Matteo@90 Visualizza Messaggio
    Per quanto riguarda la &:
    alla fine del primo foreach $colore è legata all ultimo elemento di $colori e cambiandone il valore si cambia anche il valore di quest ultimo .Mettendo la & però al primo ciclo del secondo foreach PHP si lega al primo elemento dell array(praticamente lo sostituisce),lasciando invariato l ultimo,e così via con le altre iterazioni.
    Ho capito giusto?A dire il vero l argomento mi è ancora un po confuso ma se ho capito bene probabilmente con un po di pratica ci faccio la mano.
    Allora... è giusto, nel senso che io ho capito che hai capito più o meno come funziona.

    Un pochino più in dettaglio ci son due concetti in gioco: il contenuto di una zona di memoria e l'indirizzo di questa zona di memoria.
    Quando si definisce una variabile, ad esempio $pippo = 5, 5 è il contenuto di una zona di memoria, $pippo è l'alias di quella zona di memoria e &$pippo è l'indirizzo della zona di memoria (passatemela oh voi lurkers).
    Se poi tu crei un'altra variabile, $pluto, se esegui $pluto = $pippo è uguale a fare $pluto = 5, quindi si va ad occupare una nuova zona di memoria slegata da quella referenziata da $pippo e ci si copia dentro il valore.
    Invece, se fai $pluto = &$pippo, $pluto diventa un altro alias della zona di memoria dove è contenuto 5. Quindi ogni modifica che fai a $pluto si ripercuote su $pippo e viceversa.

    Si può modificare il contenuto di un array per mezzo di un foreach senza usare la &?
    Certo :
    Codice:
    $colori = array('rosso', 'bianco', 'verde', 'giallo');    
    foreach ($colori as $key => $colore) {      
    	$colori[$key] = strtoupper($colore);  
    }
    echo json_encode($colori);

    Citazione Originariamente Scritto da Matteo@90 Visualizza Messaggio
    Poi una curiosità...perchè mel_rtcw dici che è meglio mettere la & il meno possibile?Per evitare che la variabile temporanea che rappresenta i singoli valori dell array (in questo caso $colore) rimanga legata ad un elemento di quest ultimo e in caso ne venga cambiato il contenuto (di $colore) possa cambiare anche l elemento dell array a cui è rimasta legata?Mi faccio le domande e mi riospondo da solo è che non son sicuro di rispondermi giusto vabbè passo argomento.. up!
    Questo è un caso particolare, cmq sì è quello il motivo.
    Per come gestisce php le variabili (dal mio punto di vista, in modo totalmente alogico) diventa difficile controllare i side-effect che una & comporta e quindi bisogna usarla con coscienza e quando davvero serve e si sa cosa si fa.
    In ogni caso, dalla mia -poca- esperienza di php ti posso assicurare che riesci a far tutto senza la & anche se, di fatto, ci perdi un pelo di efficienza. D'altronde bisogna contestualizzare, utilizzi PHP per fare un sito internet, non devi programmare l'applicazione che calcola la traiettoria di rientro dell'apollo 11, per cui utilizzare 500KB in più di memoria perché non metti la & isn't a big deal

  9. #9

    Predefinito Re: PHP /nooob

    Citazione Originariamente Scritto da meL.rtcw Visualizza Messaggio
    json scoprirai più avanti cos'è e a che serve, se non ti stufi prima, gh. Cmq permette di comprimere in una stringa oggetti e array senza fare cicli o altro. Se vuoi dare un'occhiata: http://json.org/



    Direi che ci siamo.



    Allora... è giusto, nel senso che io ho capito che hai capito più o meno come funziona.

    Un pochino più in dettaglio ci son due concetti in gioco: il contenuto di una zona di memoria e l'indirizzo di questa zona di memoria.
    Quando si definisce una variabile, ad esempio $pippo = 5, 5 è il contenuto di una zona di memoria, $pippo è l'alias di quella zona di memoria e &$pippo è l'indirizzo della zona di memoria (passatemela oh voi lurkers).
    Se poi tu crei un'altra variabile, $pluto, se esegui $pluto = $pippo è uguale a fare $pluto = 5, quindi si va ad occupare una nuova zona di memoria slegata da quella referenziata da $pippo e ci si copia dentro il valore.
    Invece, se fai $pluto = &$pippo, $pluto diventa un altro alias della zona di memoria dove è contenuto 5. Quindi ogni modifica che fai a $pluto si ripercuote su $pippo e viceversa.

    Si può modificare il contenuto di un array per mezzo di un foreach senza usare la &?
    Certo :
    Codice:
    $colori = array('rosso', 'bianco', 'verde', 'giallo');    
    foreach ($colori as $key => $colore) {      
        $colori[$key] = strtoupper($colore);  
    }
    echo json_encode($colori);



    Questo è un caso particolare, cmq sì è quello il motivo.
    Per come gestisce php le variabili (dal mio punto di vista, in modo totalmente alogico) diventa difficile controllare i side-effect che una & comporta e quindi bisogna usarla con coscienza e quando davvero serve e si sa cosa si fa.
    In ogni caso, dalla mia -poca- esperienza di php ti posso assicurare che riesci a far tutto senza la & anche se, di fatto, ci perdi un pelo di efficienza. D'altronde bisogna contestualizzare, utilizzi PHP per fare un sito internet, non devi programmare l'applicazione che calcola la traiettoria di rientro dell'apollo 11, per cui utilizzare 500KB in più di memoria perché non metti la & isn't a big deal
    moolto gentile farò qualche prova in questi giorni

  10. #10
    Il Nonno L'avatar di Jedi-78
    Data Registrazione
    18-10-01
    Località
    Cassano Magnago
    Messaggi
    5,784

    Predefinito Re: PHP /nooob

    Allora... Le istruzioni and ed or (&& ed ||) sono operatori di confronto logici. Li usi nei costrutti if,while,... Gli operatori AND ed OR (& ed |) sono operatori di matematica binaria. Li usi per ottenere un risultato.

    Esempio 4 and 0 false.
    4 && 1 true
    4 AND 1 = 0 (100 & 001)
    5 AND 1 = 1 (101 & 001)

    2 or 1 true
    2 OR 1 = 3 (10 | 01)

    Gli and/or piccoli o doppi (&&/||) fanno il confronto sul totale. I maiuscoli o singoli AND/OR (&/|) sui bit

    Ricorda: l'AND è una moltiplicazione uno zero prevale. L'OR è una somma, un numero non zero prevale.

    Edit: scusate, mi aveva caricato solo il primo post...
    Ultima modifica di Jedi-78; 17-06-13 alle 19:39:13

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice HTML è Disattivato