[Powered by Google Translate] [Sezione 8 - più confortevole] [Rob Bowden - Harvard University] [Questo è CS50. - CS50.TV] Queste note di sezione settimane stanno per essere piuttosto breve, quindi sono solo andando a continuare a parlare, voi ragazzi stanno andando a continuare a chiedere domande, e cercheremo di riempire il tempo, per quanto possibile. Un sacco di gente pensa che questo pset non è necessariamente difficile, ma è molto lungo. Le specifiche pset si prende un'ora per leggere. Noi vi diamo un sacco di SQL di cui avete bisogno per l'uso. Ci si cammina attraverso un sacco di esso, quindi non dovrebbe essere troppo male. Qualcuno ha iniziato o finito? E 'l'ultima pset. Oh, mio ​​Dio.. Di solito c'è un JavaScript dopo che la presente, ma le cose cambiano di calendario rende tutto 1 settimana corta, e non abbiamo più un pset JavaScript. Non so come questo influenzi se JavaScript sta per apparire durante l'esame o Quiz 1. Immagino che sarà qualcosa di simile a quello che devi sapere cose di alto livello su JavaScript, ma dubito che avremmo solo dare retta codice JavaScript dal momento che non hanno avuto un pset in esso. Ma che sarà roba per la revisione quiz prossima settimana. Sezione di domande. Un sacco di questa roba è un po 'mal formulata, ma parleremo perché. A differenza di C, PHP è un linguaggio "dinamicamente tipizzato". Cosa significa, vi chiederete? Beh, dì addio a tutti quelli char, float, int, e altre parole chiave è necessario utilizzare quando si dichiarano variabili e funzioni in C. In PHP, il tipo di una variabile è determinata dal valore che è attualmente in possesso. Quindi, prima di scrivere il codice in un file chiamato dynamic.php, PHP è dinamicamente tipizzati. Questo è vero. Non sono d'accordo con il fatto che che significa che stiamo dicendo addio a char, float, int, e altre parole chiave. La differenza esatta tra tipizzazione dinamica e l'alternativa, che è staticamente tipizzato, è che dinamicamente tipizzati, tutto il vostro controllo del tipo e materiale accade in fase di esecuzione, mentre staticamente tipizzato accade in fase di compilazione. La parola statica, in generale, sembra voler dire le cose in fase di compilazione. Credo che ci sono altri usi per essa, ma in C quando si dichiara una variabile statica, la sua memoria viene allocata al momento della compilazione. Qui, dinamicamente tipizzati significa solo che - In C, se si tenta di aggiungere una stringa e un intero, durante la compilazione, sta andando a lamentarsi perché sta andando a dire che non è possibile aggiungere un int e un puntatore. Non è solo un'operazione valida. Questa è un'altra cosa che ci arriveremo in un secondo. Ma quel tipo di controllo, il fatto che si lamenta in fase di compilazione, è il controllo di tipo statico. Ci sono lingue in cui non c'è bisogno di dire char, float, int, e tutte queste cose, ma la lingua può dire dal contesto della cosa tipo che dovrebbe essere, ma è ancora staticamente tipizzato. Quindi, se si prende 51, OCaml, non è necessario utilizzare uno di questi tipi, ma ancora in fase di compilazione si dice che non si può fare questo perché si sta mixando un int e una stringa. Dinamicamente digitato significa solo che in qualche momento durante la fase di esecuzione si sta andando a prendere un reclamo. Se è stato utilizzato anche Java prima, in generale, quasi tutti i C-tipo di linguaggio sta per essere staticamente tipizzato, in modo da C, C + +, Java, tutti coloro che sono generalmente staticamente tipizzato. In Java quando si compila qualcosa e stai dicendo stringa s è uguale a qualcosa di nuovo che non è una stringa, che sta andando a lamentarsi fatto che questi tipi semplicemente non all'altezza. Quello sta andando a lamentarsi in fase di compilazione. Ma ha anche un po 'di tempo dinamico le cose come se si tenta di lanciare qualcosa di un tipo che è più specifico del suo tipo corrente, non c'è niente che possa fare al momento della compilazione di verificare se tale fusione sta per avere successo. Java ha anche un certo tipo di controllo dinamico che appena si arriva a tale riga di codice quando in realtà è in esecuzione, è andare a fare il cast, verificare se tale cast era valida, in primo luogo, e se non lo era, allora sta andando a lamentarsi di avere un tipo non valido. Tipo di controllo dinamico. Digitare questo in un file chiamato dynamic.php. Dynamic.php. Io decomprimere che la formattazione. Abbiamo una variabile, abbiamo impostato il numero intero 7, poi andremo a stampare e% s - Oh, stiamo stampando il tipo di esso, in modo gettype sta per restituire il tipo della variabile. Stiamo solo la stampa del tipo più e più volte. Abbiamo appena php.dynamic.php. Vedremo che varia da intero a stringa in Boolean come si attraversano. In C non esiste un tipo di dati Boolean, non c'è nessun tipo di dati stringa. Ci sono char * e Boolean tende solo per essere int o char o qualcosa del genere. In PHP esistono questi tipi, e questo è uno dei grandi vantaggi di PHP oltre C - che le operazioni di stringa sono infinitamente più facile in PHP di C. solo di lavoro. Così siamo tornati qui. Corremmo dynamic.php. Questo dice l'interprete PHP, chiamata php, per eseguire il codice PHP in dynamic.php. In caso di errori nel file, l'interprete vi dirà! L'interprete, questo è un altro grande differenza tra PHP e C. In C è necessario compilare qualcosa e quindi si esegue il file compilato. In PHP non si compila nulla. Così l'interprete PHP è fondamentalmente solo la lettura di questo riga per riga. Colpisce var = 7 poi colpisce printf poi colpisce var poi colpisce printf e così via. C'è un po 'di compilare lo fa, e memorizza nella cache i risultati quindi se si esegue lo script in seguito è possibile fare un po ', ma in fondo si tratta di una linea per linea sorta di cose. Ciò significa che un sacco di ottimizzazioni che si ottiene in C, come la compilazione, è solo in generale il compilatore può fare un sacco di trucchi per voi. Si può estrarre le variabili non utilizzate, si può fare tutto questo genere di cose, che può fare la ricorsione in coda. In PHP non avete intenzione di ottenere tale vantaggio perché è solo andare per avviare l'esecuzione riga per riga per riga, e in realtà non riconoscere queste cose come facilmente dal momento che non è 1 grande passaggio di compilazione sulla cosa e poi l'esecuzione; è solo riga per riga. Ecco, questo è l'interprete. Torna alla nostra tipizzazione dinamica: abbastanza freddo, eh? Lei sicuramente non poteva farlo in C! Ora, vedere se si riesce a capire il tipo di ciascuno dei seguenti valori. Vedere questo per riferimento. Quindi 3.50. Che tipo pensi che sarà? Qui ci sono i tipi che abbiamo. Abbiamo Caccio, numeri interi, virgola mobile, stringhe, array, oggetti, e poi risorse, che è una specie di vaga. Penso che ci sia in realtà un esempio qui. Poi c'è NULL. NULL è un tipo speciale. A differenza di C dove NULL è solo un puntatore con l'indirizzo 0, in PHP, NULL è proprio tipo in cui l'unica cosa valida di quel tipo è NULL. Questo è molto più utile per il controllo degli errori. In C dove abbiamo avuto questo problema per il quale se si torna NULL, vuol dire che stai restituendo un puntatore NULL o utilizzando NULL per indicare errore o di tutta quella confusione che abbiamo avuto ad un certo punto. Qui, di ritorno NULL generalmente significa errore. Un sacco di cose anche restituire false per errore. Ma il punto è il tipo NULL, l'unica cosa del tipo NULL è NULL. Poi callback è come è possibile definire alcune funzioni anonime. Non è necessario dare la funzione di un nome, ma non avranno a che fare con questo qui. Guardando i tipi che essi si aspettano di conoscere, cosa ne pensate del tipo di 3.50 è? >> [Studente] Float. Gia '. Allora qui, cosa ne pensi del tipo di questo? >> [Studente] Array. Gia '. Il primo era galleggiante, il secondo è un array. Si noti che questa matrice non è come un array C dove si ha l'indice 0 ha un certo valore, indice 1 ha un certo valore. Qui sono gli indici a, b, e c ed i valori sono 1, 2, e 3. In PHP non vi è alcuna differenza tra un array associativo e solo una serie regolare come si potrebbe pensare di esso in C. C'è solo questo, e sotto il cofano una serie regolare è solo un array associativo dove 0 mappe per un valore allo stesso modo di un mapping a un certo valore. Per questo motivo, PHP può essere piuttosto male per davvero veloci codice / benchmarking cose dal momento che in C quando si utilizza una matrice a sapere che l'accesso a un membro è costante di tempo. In PHP l'accesso a un utente è che sa quanto tempo? E 'probabilmente costante se gli hash correttamente. Chi sa che cosa sta facendo veramente sotto il cofano? Hai davvero bisogno di guardare l'attuazione per vedere come sta andando a che fare con questo. Allora fopen. Penso che qui facciamo solo PHP fopen manuale a guardare il tipo restituito. Vediamo qui è possibile cercare praticamente qualsiasi funzione nel manuale PHP e questa è una sorta di pagina di manuale di PHP. Il tipo di ritorno sta per essere risorsa. È per questo che ho cercato, perché non abbiamo davvero definire risorse. L'idea di risorsa, in C si ha una sorta di * FILE o qualsiasi altra cosa; in PHP la risorsa è il tuo * FILE. E 'quello che si sta andando ad essere la lettura, è quello che si sta andando ad essere la scrittura. Di solito è esterna, quindi è una risorsa che può tirare le cose da e gettare le cose a. E, infine, qual è il tipo di NULL? >> [Studente] NULL. Gia '. Quindi l'unica cosa che è NULL è NULL. NULL è NULL. Una caratteristica del sistema di tipi di PHP (nel bene e nel male) è la sua capacità di destreggiarsi tra i tipi. Quando si scrive una riga di codice PHP che unisce valori di tipi diversi, PHP cercherà di fare la cosa più sensata. Provare di ciascuna delle seguenti righe di codice PHP. Cosa stampato? E 'quello che ti aspettavi? Perché o perché no? Questo fatto di PHP è quello che fa ciò che noi chiamiamo debolmente tipizzato. Debolmente tipizzato e fortemente tipizzati, esistono diversi usi di tali termini, ma la maggior parte delle persone usano debolmente tipizzato e fortemente tipizzati per indicare questo genere di cose dove ("1" + 2), che funziona. In C che non avrebbe funzionato. È possibile immaginare che questo non funziona. Un sacco di persone si mescolano tipizzazione dinamica e la tipizzazione debole e tipizzazione statica e la tipizzazione forte. Python è un altro esempio di un linguaggio che è dinamicamente tipizzati. Si può buttare in giro per i tipi di variabili e che sta per determinare in fase di esecuzione Riscontri eventuali errori. In Python che sta per eseguire questo e vedrà ("1" + 2); e questo non perché dice che non è possibile aggiungere una stringa e un intero. In PHP, che è altrettanto dinamicamente tipizzati, questo non mancherà. Tipizzazione debole ha a che fare con il fatto che si fa cose con tipi che in realtà non ha senso necessariamente. So ("1" + 2), posso immaginare che sia la stringa di 12, posso immaginare che sia la stringa 3, Posso immaginare che sia il numero intero 3. Non è necessariamente ben definita, e noi probabilmente stai andando a vedere qui che quando si stampa ("1" + 2), ma è probabilmente andando a finire per essere differente di stampa (1 + "2"). E questo tende ad essere, a mio parere, in peggio. Qui siamo in grado di provare questi. Un altro trucco poco di PHP è che non c'è bisogno di scrivere effettivamente il file. Lo fa hanno eseguito questa modalità di comando. Così php-r, allora possiamo buttare nel comando qui: "Stampare ('1 '+ 2),« e mi butto una nuova linea. Questo stampato 3. Sembra che la stampa 3 ed è il numero intero 3. Così ora proviamo il contrario: "Stampare (1 + '2 '); Otteniamo 3, e lo sta anche andando a essere un numero intero 3? Onestamente non hanno idea. Sembra che sia coerente. Non c'è alcuna possibilità di esso che è la 12 corde o cose del genere perché PHP, a differenza di JavaScript e Java troppo, ha un operatore separato per la concatenazione. Concatenazione in PHP è dot. Così la stampa (1 '2 '.), Sta per dare a noi 12. Questo tende a creare confusione in cui le persone cercano di fare qualcosa di simile str + = qualche altra cosa che si desidera aggiungere al fine del loro stringa, e che sta per fallire. Hai bisogno di fare str. = Quindi non dimenticate di concatenazione in PHP è un punto. Altre cose da provare: print ("CS" + 50); Te l'ho detto che non vi è alcuna speranza di questo risultato CS50 poiché non è concatenazione +. Cosa ne pensi questo sta per finire per essere? Onestamente ho assolutamente idea. Sembra che solo 50. Si vede la stringa, e scommetto che se mettiamo 123CS - Si vede la prima stringa, tenta di leggere un numero intero da esso o un numero da esso. In questo caso si vede 123CS. "Non ha senso come un intero, quindi sto solo andando a pensare a 123." Quindi 123 + 50 sta per essere 173. E qui comincia la lettura di questo come un numero intero. Non vede nulla, in modo che la tratta semplicemente come 0. Quindi 0 + 50 sta per essere 50. Questo Sto assumendo sta per fare qualcosa di simile. Sto pensando 99. Già, perché sta andando a prendere la prima - Così 99. Qui (10/7), se questo fosse C, cosa che restituiscono? [Studente] 1. >> Si ', sarebbe 1 in quanto il 10/7 è dividere 2 numeri interi. Un numero intero diviso per un numero intero sta per restituire un numero intero. Non si può tornare: 1 per qualsiasi punto che sarebbe stato, quindi è solo andando a restituire 1. Qui la stampa (10/7), che sta per interpretare effettivamente tale. E questo significa che se si vuole realmente fare arrotondamento intero e cose del genere, quello che devi fare di stampa (piano (10/7)); In C è probabilmente strano che si può contare su troncamento intero regolarmente, ma in PHP non è possibile perché sarà automaticamente trasformarsi in un float. E poi (7 + true); cosa pensi che sarà? Sto indovinando 8 se sta andando a interpretare come 1 vero. Sembra come se fosse 8. Quindi, tutto ciò che abbiamo fatto negli ultimi 10 minuti si dovrebbe assolutamente mai fare. Vedrete il codice che fa questo. Non deve essere semplice come questo. Si potrebbe avere 2 variabili, e 1 variabile sembra essere una stringa e l'altra variabile sembra essere un int, e quindi si aggiunge queste variabili insieme. Poiché PHP dinamicamente tipizzati e non farà alcun tipo di controllo per voi e dal momento che è debolmente tipizzato e dal momento che sarà solo buttare automaticamente queste cose insieme e tutto solo di lavoro, è difficile sapere anche che questa variabile deve essere una stringa ora, quindi non dovrei aggiungere a questa variabile, che è un numero intero. Le migliori pratiche è se una variabile è una stringa, tenerlo come una stringa per sempre. Se una variabile è di tipo int, tenerlo come un int per sempre. Se si vuole affrontare con i numeri interi e stringhe, è possibile utilizzare varsint - che è JavaScript. Intval. Lo faccio tutto il tempo. PHP e JavaScript mescolo tutto. Così intval sta per restituire il valore intero di una variabile. Se si passa a "stampare (intval ('123 ')), si ottiene 123. Intval sé non ha intenzione di fare il controllo per noi che è esclusivamente un numero intero. Il manuale PHP, ci sono così tante funzioni disponibili, ecco penso che quello che uso è is_numeric primo. Sto indovinando che ha restituito false. Questa è un'altra cosa che dobbiamo andare oltre è ===. Così is_numeric ('123df '), non si potrebbe pensare a questo come a is_numeric. In C si dovrebbe iterare su tutti i caratteri e verificare se ogni carattere corrisponde al numero o qualsiasi altra cosa. Qui is_numeric sta andando a fare per noi, ed è restituito false. Così, quando ho stampato questo, stampato nulla, ecco: sto per vedere, le è capitato di essere falso? E così ora è la stampa 1. A quanto pare la stampa 1 come vera invece di stampare vero come vero. Mi chiedo se lo faccio print_r. No, lo fa ancora 1. Tornando ===, == esiste ancora, e se si parla di Tommy dirà == è perfettamente bene. Io vado a dire che == è terribile e non si dovrebbe mai usare ==. La differenza è che le cose a confronto == dove può essere vero, anche se non sono dello stesso tipo, che mette a confronto le cose e === Prima di tutto verifica che sono dello stesso tipo? Sì. Ok, ora vado a vedere se effettivamente paragonare ad essere uguali. È possibile ottenere cose strane come 10 è uguale a - Vediamo cosa che dice. Quindi ('10 '== '1 e1'); Questo restituisce true. Qualcuno ha qualche ipotesi perché questo restituisce true? Non si tratta solo di questo. Forse questo è un suggerimento. Ma se cambio che per un f - è dannatamente! Continuo ad usare le virgolette doppie. La ragione per cui le virgolette sono inveire contro di me è perché ho messo questo tra virgolette doppie. Così ho potuto evitare le doppie virgolette in qui, ma le virgolette singole rendere più facile. Quindi ('10 '== '1 f1'); non stampa vero. ('10 '== '1 E1'); stampa vera. [Studente] E 'hex? >> Non è esadecimale, ma è vicino che è come - 1e1, notazione scientifica. Riconosce 1e1 come 1 * 10 ^ 1 o qualsiasi altra cosa. Quelli sono interi uguali. Se facciamo === allora sarà falsa. Io in realtà non hanno alcuna idea se facciamo == che dire (10 e '10abc ');? Bene. Ecco, questo è vero. Quindi, proprio come quando hai fatto (10 + '10abc '), e che sarebbe stato 20, qui (10 == '10abc '); è vero. Ancora peggio sono cose come (false == NULL); è vero o (false == 0), è vero, (false == []); Ci sono casi di strane - Questo è uno di quei casi strani. Si noti che (false == []), è vero. ('0 '== False), è vero. ('0 '== []), È falso. Così == è in alcun modo transitivo. una può essere uguale a B e può essere uguale a C, b ma potrebbe non essere uguale a c. Questo è un abominio per me, e si dovrebbe sempre usare. === [Studente] Possiamo fare! == Come bene? >> [Bowden] Sì. L'equivalente sarebbe! = E! ==. Questo è in realtà cresciuto nelle specifiche pset dove un sacco di funzioni di ritorno - Il manuale PHP è buono su questo. Si mette in una grande scatola rossa, "Questo restituirà false se c'è un errore." Ma tornando 0 è una cosa perfettamente ragionevole per tornare. Pensate a qualsiasi funzione che dovrebbe restituire un intero. Diciamo che questa funzione dovrebbe contare il numero di righe in un file o qualcosa del genere. In circostanze normali, si passa a questa funzione di un file e sta andando restituiscono un numero intero che rappresenta il numero di righe. Quindi 0 è un numero del tutto ragionevole se il file è solo vuoto. Ma cosa succede se si passa un file non valido e la funzione avviene per restituire false se si passa un file non valido? Se solo non == non sei differenziare il caso tra file non valido e il file vuoto. Utilizzare sempre ===. E 'tutto di quelli. In PHP, il tipo di matrice è diverso da quello a cui siete abituati in C. In effetti, si può avere già notato in precedenza, quando si è visto che questo è di tipo array. La sintassi staffa è nuova a partire da PHP 5.4, che è l'ultima versione di PHP. Prima di questo è sempre dovuto scrivere array ('a' -> 1, 'b' -> 2. Questo è stato il costruttore per un array. Oggi PHP è finalmente arrivato intorno alla sintassi bella di soli parentesi quadre, che è solo molto meglio di array. Ma considerando PHP 5.4 è la versione più recente, si possono incontrare luoghi che non hanno nemmeno PHP 5.3. Durante l'estate ci siamo imbattuti in questo problema per il quale PHP 5.3 era quello che abbiamo avuto l'apparecchio, ma il server che abbiamo distribuito tutti i nostri libri grado e presentare e tutta quella roba a PHP era 5,4. Non sapendo questo, abbiamo sviluppato al punto 5.3, ha spinto a 5,4, e ora tutto ad un tratto nessuno del nostro codice funziona perché ci è accaduto di essere stato modifiche tra 5.3 e 5.4 che non sono compatibili, e dobbiamo andare a risolvere tutte le nostre cose che non funzionano per PHP 5.4. Per questa classe, poiché l'apparecchio ha ancora PHP 5,4, va benissimo usare le parentesi quadre. Ma se stai cercando le cose su Internet, se stai cercando un qualche tipo di cose serie, molto probabilmente si sta andando a vedere l'incantesimo su sintassi di matrice dal costruttore che è stato intorno dal PHP è nato e sintassi parentesi quadra è stato intorno per i mesi ultimi due o ogni volta che 5,4 è venuto intorno. Questo è il modo di indice. Proprio come in C come se fosse indice tra parentesi quadre come $ array [0], $ array [1], $ array [2], è indice allo stesso modo se vi capita di avere i vostri indici di essere stringhe. Quindi, $ array ['a'] e $ array ['b']. $ Array [b]. Perché questo sarebbe sbagliato? Sarà probabilmente generato un avviso, ma funzionano ancora. PHP tende a farlo. Esso tende a solo, "ho intenzione di mettervi in ​​guardia su questo, ma io sono solo intenzione di andare avanti "E fare tutto ciò che posso." Probabilmente tradurre questo in una stringa, ma è possibile che a un certo punto nel passato qualcuno ha detto definire b per essere 'CIAO MONDO'. Così ora b potrebbe essere una matrice costante e $ [b] saranno effettivamente fare 'CIAO MONDO'. Credo che a questo punto, o almeno le nostre impostazioni PHP, se si tenta di indice in un array e la chiave non esiste, si ottiene un errore. Non credo che sarà solo un avviso. O almeno è possibile impostarlo in modo che non si limita a mettere in guardia, solo che non riesce a dritto. Il modo in cui si controlla per vedere se vi è in realtà tale indice è isset. Così isset ($ array ['CIAO MONDO']) restituisce false. isset ($ array ['b']) restituisce true. È possibile combinare queste sintassi. Sono abbastanza sicuro di quello che questo array finirebbe per essere è - Siamo in grado di provarlo. Oh, ho bisogno di PHPWord. Questa è la sintassi di miscelazione in cui si specifica ciò che la chiave è e non si specifica ciò che la chiave è. SO 3 qui è un valore. Lei ha detto quello che non è esplicitamente la chiave sta per essere. Cosa ne pensa la chiave sarà? [Studente] 0. >> Sto indovinando 0 solo perché è il primo che non è stato specificato. Si può effettivamente fare un paio di questi casi. Così è stampare print_r ricorsiva. Verrà stampata l'intero array. Sarebbe stampare sottoarray della matrice se ci fossero. Così print_r ($ array); php.test.php. Lo fa sembrare che ha dato 0. In realtà c'è qualcosa da tenere a mente qui, ma torneremo ad esso in un secondo. Ma cosa succede se mi capita di fare questo indice 1? PHP non fa differenza tra gli indici delle stringhe e indici interi, quindi a questo punto che ho appena definito un indice 1 e non posso fare entrambe le cose $ array [1] e $ array ['1 '] e sarà lo stesso indice e la stessa chiave. Così ora che cosa ne pensi 3 sta per essere? >> [Studente] 2. >> [Bowden] sto cercando di indovinare 2. Gia '. E '2. E se abbiamo fatto questo è 10, questo è un 4? Cosa ne pensa l'indice di 3 sta per essere? Sto pensando 11. La mia ipotesi su ciò che PHP fa - e credo di aver visto prima - si tiene solo traccia di ciò che il più alto indice numerico che viene utilizzato finora è. Non è mai intenzione di assegnare un indice di stringa 3. Sarà sempre un indice numerico. Quindi registra il più alto è assegnato fino ad ora, che risulta essere 10, e sta andando a dare 11-3. Quello che ho detto prima, notare il modo in cui si sta stampando questa matrice. Esso stampa Rif. 10, il tasto 4, chiave 11, chiave d. O anche facciamo - Credo che non ho messo a 0, ma è la stampa 1, 2, 3, 4. Che cosa succede se passa qui? Oppure facciamo effettivamente passare questi 2. Ora la stampa 2, 1, 3, 4. PHP gli array non sono proprio come il vostro tavolo normale hash. E 'perfettamente ragionevole pensare a loro come tabelle hash 99% del tempo. Ma nelle tabelle hash non ha senso dell 'ordine in cui sono state inserite le cose. Quindi, non appena lo si inserisce nella tabella hash, assumono non c'è lista collegata e si potrebbe giudicare in una lista concatenata che è stato inserito per primo. Ma qui abbiamo inserito 2, primo e sa quando è la stampa di questa matrice che 2 viene prima. Non lo stampare in un qualsiasi ordine. La struttura di dati tecnici che si sta usando è una mappa ordinata, in modo che associa chiavi a valori e ricorda l'ordine in cui sono state inserite quelle chiavi. Fondamentalmente si tratta di alcune complicazioni dove è fastidioso in realtà - Diciamo che ha una matrice 0, 1, 2, 3, 4, 5 e si desidera estrarre indice 2. Un modo di farlo, vediamo cosa simile. 0, 2, 1, 3, 4. Unset succede a disinserire entrambe le variabili e gli indici degli array. Così unset ($ array [2]); Ora, che cosa è questo andare a guardare come? 2 è appena andato, quindi è perfettamente bene. Più fastidioso è che se si vuole che le cose siano in realtà come un array. Metterò numeri casuali. Ora notate i miei indici. Io voglio che sia proprio come un array C dove va da 0 a lunghezza - 1 e posso scorrere su di esso in quanto tale. Ma non appena ho disinserito il secondo indice, ciò che era in indice 3 non ora diventato indice 2. Invece rimuove solo che indice e ora si va 0, 1, 3, 4. Questo è perfettamente ragionevole. E 'solo fastidioso e bisogna fare le cose come giunzione array. Gia '. [Studente] Che cosa accadrebbe se si ha un ciclo for e si voleva andare su tutti gli elementi? Quando ha colpito 2, sarebbe cedere mai? L'iterazione di un array. Ci sono 2 modi per farlo. È possibile utilizzare un normale ciclo for. Questo è un altro complessità di PHP. La maggior parte delle lingue, direi, avere una sorta di lunghezza o len o qualcosa del genere indica la lunghezza di un array. In PHP è conteggio. Quindi count ($ array); $ i + +) Diciamo solo print ($ array [$ i]); Notice: Undefined offset: 2. E 'solo andando a fallire. Questa è la ragione che, per la maggior parte, non è necessario scorrere un array come questo. Potrebbe essere un'esagerazione, ma non hai mai bisogno di iterare su un array come questo perché PHP fornisce la sua sintassi foreach dove foreach ($ array come $ item). Ora, se il risultato della stampa ($ item); - we'll discuterne in un secondo - che funziona perfettamente bene. Il modo in cui foreach sta lavorando è il primo argomento è l'array che si sta iterando. E il secondo argomento, oggetto, attraverso ogni passaggio del ciclo for sta andando a prendere la prossima cosa nella matrice. Quindi ricorda l'array ha un ordine. La prima volta attraverso il ciclo for, articolo sta per essere 123 allora sarà 12 allora sarà 13 allora sarà 23 allora sarà 213. Le cose si fanno davvero strano quando si fa qualcosa di simile foreach. Vediamo cosa succede, perché non si dovrebbe mai fare questo. E se unset ($ array [1]); Questo è stato probabilmente previsto. Stai iterazione di questa matrice, e ogni volta che stai disinserimento del primo indice. Quindi, per l'indice 0, la prima cosa, elemento assume valore 0, in modo che sarà 123. Ma all'interno del ciclo for che unset indice 1, in modo che significa 12 è andato. Così la stampa. PHP_EOL. PHP_EOL è solo capo, ma è tecnicamente più portabile poiché a capo di Windows è diversa da newline su Mac e UNIX. In Windows 'a capo' \ r \ n, mentre tutto il resto tende solo per essere \ n. PHP_EOL è configurato in modo che utilizzi qualunque sia il ritorno a capo del sistema è. Quindi, stampare il. Cerchiamo di non print_r ($ array) alla fine. Non avevo idea che sarebbe il comportamento. Articolo assume ancora il valore 12 anche se abbiamo unset 12 prima abbiamo mai avuto modo dalla matrice. Non prendere la mia parola su questo, ma sembra che foreach crea una copia della matrice e poi voce assume tutti i valori di quella copia. Quindi, anche se si modifica l'array all'interno del ciclo for, non si cura. Articolo assumerà i valori originali. Proviamo di annullarla. E se questo è di $ array [1] = "ciao"; Anche se abbiamo messo "ciao" nella matrice, non è mai elemento assume tale valore. C'è un'altra sintassi per il foreach loop dove si mettono 2 variabili separate da una freccia. La prima variabile sta per essere la chiave di tale valore, e questa seconda variabile sta per essere la voce stessa esatta. Questo non è interessante qui, ma se torniamo al nostro caso originale di 'a' -> 1, 'B' -> 1, qui se abbiamo appena iterazioni per ogni array come elemento, articolo sta per essere di 1 ogni volta. Ma se vogliamo anche sapere il tasto associato a tale elemento allora facciamo come $ chiave -> $ item. Così ora possiamo fare print ($ chiave. ':'. Ora è l'iterazione di stampa e di ogni tasto e il suo valore associato. Un'altra cosa che possiamo fare in loop foreach è che si potrebbe vedere questa sintassi. E commerciali prima di nomi di variabili tendono ad essere come il PHP fa riferimento. Se i riferimenti sono molto simili ai puntatori, non si dispone di puntatori, in modo da non fare con la memoria direttamente. Ma si ha riferimenti in cui 1 variabile si riferisce alla stessa cosa di un'altra variabile. All'interno di qui facciamo $ item. Torniamo a 1, 10. Facciamo $ item + +, che ancora esiste in PHP. Si può ancora fare + +. php.test.php. Devo stamparlo. print_r ($ array); Stampiamo 2, 11. Se avessi appena fatto foreach ($ array da $ articolo), allora voce sarà il valore 1 la prima volta attraverso il ciclo. Esso aumenterà 1 a 2 e poi abbiamo finito. Allora si passerà attraverso il secondo passaggio del ciclo e che il punto è 10. Si incrementi voce a 11, e poi che è appena buttato via. Poi abbiamo print_r ($ array), e vediamo che questo è solo 1, 10. Quindi l'incremento che abbiamo fatto è stato perso. Ma foreach ($ array come & $ item) ora questa voce è la voce stessa di questa qui. E 'la stessa cosa. Quindi $ item + + sta modificando matrice 0. In sostanza, si può anche fare $ k -> array $ item e si può fare $ [$ k] + +; Quindi un altro modo di fare questo, siamo liberi di modificare voce, ma questo non modificare il nostro array originale. Ma se usiamo k, che è la nostra chiave, allora possiamo solo indice nel nostro array usando quella chiave e incrementare tale. Questo più direttamente modifica il nostro array originale. Si può anche fare che se per qualche motivo si voleva la possibilità di modificare - In realtà, questo è perfettamente ragionevole. Non hai voglia di scrivere $ array [$ k] + +, si voleva solo scrivere $ item + + ma è comunque volevo dire if ($ k === 'a') quindi incrementare elemento e quindi stampare il nostro array. Così ora che cosa ci aspettiamo print_r fare? Quali valori devono essere stampati? [Studente] 2 e 10. >> [Bowden] Solo se la chiave era 'a' facciamo in realtà la stampa che. Probabilmente molto raramente, se non mai, sarà necessario definire le funzioni in PHP, ma si potrebbe vedere qualcosa di simile in cui si definisce una funzione come qualsiasi funzione. Di solito si direbbe ($ pippo, $ bar) e quindi definire di essere qualsiasi cosa. Ma se faccio questo, allora ciò significa che tutto ciò che chiama tutto ciò, qualunque chiama baz, in modo che il primo argomento passato a baz possono essere cambiati. Facciamo $ pippo + +; e all'interno di qui facciamo Baz ($ item); Ora stiamo chiamando una funzione. L'argomento è preso per riferimento, il che significa che se lo modifica stiamo modificando la cosa che è stata approvata trovi E la stampa di questo ci aspettiamo che - a meno che non ho fatto un casino sintassi - abbiamo ottenuto 2, 11, quindi è stato effettivamente incrementato. Notare che abbiamo bisogno di riferimenti a 2 posti. Che cosa succede se ho fatto questo? Che cosa significa? [Studente] Cambierà. Sì >>. L'articolo è solo una copia del valore nella matrice. Così voce cambia a 2, ma l'array ['a'] sarà ancora 1. O che cosa se faccio questo? Ora elemento viene inviato in copia a baz. Quindi la copia della tesi sarà incrementato a 2, ma elemento stesso non è mai stato incrementato a 2. E voce è la stessa cosa di qualsiasi supporto di matrice, in modo tale matrice non è mai stato incrementato. Quindi entrambi questi luoghi ne hanno bisogno. PHP di solito è abbastanza intelligente per questo. Si potrebbe pensare che voglio passare per riferimento - Questo era in realtà una domanda su uno dei pset. Era una cosa questions.txt dove si dice, Perché potrebbe voler passare questa struttura per riferimento? Qual è stata la risposta a questo? [Studente] Quindi non c'è bisogno di copiare qualcosa di grande. Sì >>. Una struttura può essere arbitrariamente grande, e quando si passa la struttura come argomento ha bisogno di copiare il struct intera da passare alla funzione, che, se si passa il struct per riferimento quindi ha solo bisogno di copiare un indirizzo di 4 byte come argomento alla funzione. PHP è un po 'più intelligente di così. Se ho qualche funzione e passo ad un array di 1000 cose, vuol dire che sta andando ad avere per copiare tutti i 1.000 di quelle cose per passare alla funzione? Non deve farlo immediatamente. Se all'interno di questa funzione non ha mai fatto modifica foo, quindi se ($ pippo === 'ciao') return true.; Notare che abbiamo mai realmente modificato l'interno argomento di questa funzione, il che significa che tutto ciò che è stato passato come mai pippo deve essere copiato perché non è che la modifica. Quindi, il modo in cui funziona è PHP gli argomenti sono sempre passati per riferimento fino a che realmente provare a modificarla. Ora, se io dico $ pippo + +, ma ora fare una copia dell'originale foo e modificare la copia. Ciò consente di risparmiare tempo. Se non si è mai toccare questa matrice di massa, non è in realtà modificare, non è necessario per rendere la copia, mentre se abbiamo appena messo questo e commerciale che significa che non ha nemmeno copiarlo anche se non lo modifica. Questo comportamento è chiamato copy-on-write. Lo potete vedere in altri posti, soprattutto se si prende un corso di sistema operativo. Copy-on-write è un modello abbastanza normale in cui non c'è bisogno di fare una copia di qualcosa meno che non sia effettivamente cambiando. Gia '. [Studente] Che cosa succede se si ha avuto l'incremento all'interno del test, in modo che solo 1 elemento su 1000 dovrebbe essere cambiato? Non ne sono sicuro. Penso che sarebbe copiare l'intera cosa, ma è possibile che sia abbastanza intelligente che - In realtà, quello che sto pensando è immaginare abbiamo avuto una matrice che assomiglia a questo: $ array2 = [ Poi l'indice 'a' è un array di [1 2 3 4], e l'indice di 'b' è un array di qualsiasi altra cosa. Ho bisogno di virgole tra tutti quelli. Immagina che non ci sono le virgole. Then 'c' è il 3 Valore. Va bene. Ora diciamo che facciamo $ baz ($ array2); dove baz non prendere questo come riferimento. Quindi $ pippo ['c'] + +; Questo è un esempio in cui stiamo passando array2 come argomento e quindi si modifica un indice specifico della matrice per incrementarla. Onestamente non hanno idea di ciò che PHP sta per fare. Si può facilmente fare una copia di tutta la cosa, ma se è intelligente, farà una copia di questi tasti in cui questo avrà il suo valore distinto ma questo può ancora puntare allo stesso array 1,2,3,4 e questo può ancora puntare allo stesso array. Torno iPad esso. Passiamo in questo array in cui questo ragazzo a 3 punti, esistono ragazzo di [1,2,3,4], questo ragazzo punta a [34, ...] Ora che stiamo passando a baz, stiamo modificando questo. Se PHP è intelligente, si può solo fare - Avevamo ancora la copia della memoria, ma se non ci fossero questi sottoarray enormi nidificate non abbiamo bisogno di copiare quelli. Non so se questo è ciò che fa, ma posso immaginare che farlo. Questo è anche un vantaggio abbastanza grande di C su PHP. PHP rende la vita molto più facile per un sacco di cose, ma tipo non hanno assolutamente idea di quanto bene si esibiranno perché non ho idea sotto la cappa quando è fare queste copie di cose, oh, è che sarà una copia costante di tempo, sta solo andando a cambiare 1 puntatore, sta andando essere una copia ridicolmente difficile lineare? E se non riesce a trovare spazio? Ha quindi bisogno di eseguire la garbage collection per avere ancora un po 'di spazio? E garbage collection può richiedere arbitrariamente lungo. In C non ci si deve preoccupare di queste cose. Ogni singola linea che si scrive può ragionare più o meno di come sta andando a svolgere. Guardiamo indietro a questi. Che bello è che non si ha a che fare con funzioni hash, liste collegate, o qualcosa di simile? Dal momento che lavora con le tabelle hash è così facile ora, ecco un divertente rompicapo su cui lavorare. Aprire un file chiamato unique.php e scrivi un programma PHP (Noto anche come "script"). Noi tendiamo a chiamarli script se sono cose brevi che si esegue dalla riga di comando. In sostanza, qualsiasi linguaggio che non si compila, ma si sta andando a eseguire il file eseguibile dalla riga di comando, è possibile chiamare lo script eseguibile. Potrei anche scrivere un programma in C che fa questo, ma io non chiamo uno script da quando ho prima compilare ed eseguire il file binario. Ma questo programma PHP che andremo a chiamare uno script. Oppure, se l'abbiamo scritto in Python o Perl o Node.js o una qualsiasi di queste cose, ci piacerebbe chiamarli tutti gli script, perché vengono eseguiti dalla riga di comando ma noi non li compila. Potremmo farlo abbastanza rapidamente. Non abbiamo intenzione di usare argv. Diciamo solo saltare attraverso questo. Chiamatela unico, scrivere un programma. Si può supporre che l'ingresso conterrà una parola per riga. In realtà, argv sarà abbastanza banale da usare. unique.php. Per prima cosa, vogliamo verificare se ci sono state tramandate 1 comando argomento della riga. Proprio come ci si aspetterebbe argc e argv in C, abbiamo ancora quelli in PHP. Quindi, se ($ argc == 2) allora non si occuperà di stampa di un messaggio o altro. Mi limiterò a uscire, il codice di errore di 1. Potrei anche tornare 1. Raramente in PHP si è in questo stato in cui siamo arrivati ​​- Di solito sei in una funzione chiamata da una funzione chiamata da una funzione chiamata da una funzione. E se qualcosa va storto e si desidera solo per uscire da tutto tutto, uscita termina proprio il programma. Questo esiste anche in C. Se siete in una funzione in una funzione in una funzione in una funzione e si vuole uccidere solo il programma, è possibile chiamare uscita e lo script termina. Ma in PHP è ancora più raro che ci sono a questo livello superiore. Di solito siamo dentro una specie di funzione, in modo che noi chiamiamo uscita in modo da non dover tornare a 1 cosa che realizza poi c'è un errore in modo che ritorna su se riconosce che c'è stato un errore. Non vogliamo far fronte a questa, in modo da uscire (1); ritorno (1), in questo caso sarebbe equivalente. Allora che cosa vogliamo aprire vogliamo fopen. Gli argomenti vanno a guardare piuttosto simili. Vogliamo fopen ($ argv [1], e vogliamo aprire per la lettura. Che restituisce una risorsa che andremo a chiamare f. Questo sembra piuttosto simile a come lo fa C tranne che non c'è bisogno di dire * FILE. Invece ci limitiamo a dire $ f. Va bene. A dire il vero, credo che questo ci dà anche un suggerimento per la funzione PHP chiamata file. PHP File. Ciò che questo sta andando a fare è leggere un intero file in un array. Non hai nemmeno bisogno di fopen esso. E 'intenzione di farlo per voi. Quindi $ righe = file ($ argv [1]); Ora tutte le righe del file sono in linee. Ora vogliamo ordinare le linee. Come ordinare le linee? Abbiamo ordinare le linee. E ora siamo in grado di stampare o qualsiasi altra cosa. Probabilmente il modo più semplice è foreach ($ righe da $ riga) echo $ riga; [Studente] Non sarebbe abbiamo anche attraversare le linee di riferimento a qualcosa in genere? E 'qui che tipo potrebbe essere definito come una sorta di funzione (& $ array). Quando si chiama la funzione di non passare per riferimento. E 'la funzione che lo definisce come prenderlo come riferimento. Questo in realtà è esattamente ciò che è andato storto quando abbiamo messo tutto ai nostri server quando siamo andati 5,3-5,4. Fino a 5.4, questo era perfettamente ragionevole. Una funzione non si aspetta di prendere come riferimento, ma è possibile passare come riferimento quindi se la funzione avviene per modificarlo, è ancora modificato. A partire da 5.4, non dovresti farlo. Così ora l'unico modo che si passa da riferimento è se la funzione lo fa esplicitamente. Se non si desidera che per modificarlo, allora avete bisogno di fare $ copia = $ righe e copia pass. Così ora le linee saranno conservati e la copia verrà modificato. php.unique.php. Potrei aver incasinato qualcosa. Unexpected 'sort'. Ci sarà qualcosa che lo fa per noi. Non è nemmeno lì. Avviso quando si legge il manuale che il primo argomento dovrebbe essere un array ed è preso come riferimento. Perché questo lamentarsi con me? Perché ho questo genere funzione ancora qui che io non voglio. Ok, php.unique.php. Non l'ho fatto passare un argomento perché non si dispone di un file. E 'php.unique.php su test.php. Ecco test.php tutti stampati in un ordine bello ordinato. Si noti che modo ordinato è un po 'strano per un file di codice perché tutte le nostre righe vuote stanno per venire prima poi stanno per venire tutti i nostri 1 tacche di livello poi vengono tutti i nostri rientranze n. Gia '. >> [Studente] Così, per il codice sorgente non è stato passato per riferimento? È che in genere passati per valore? [Bowden] Quando si chiama una funzione, non determina se è stato passato per riferimento. E 'la definizione della funzione che determina se è stato passato per riferimento. E guardando la definizione della funzione di ordinamento o semplicemente in cerca di questo, ci vuole un argomento per riferimento. Quindi, indipendentemente dal fatto che si desidera prendere per riferimento, lo fa prendere per riferimento. Esso modifica l'array in posizione. Questo non è solo consentito. Lei non è autorizzato a farlo. >> [Studente] Oh, va bene. [Bowden] Questo, specie sta andando a prendere le linee di riferimento e modificarlo. E ancora, se non vuoi fare questo, si può fare una copia di sorta. Anche in questo caso, copia non è una copia di linee. Essa ricorda solo per la stessa cosa fino a quando non prima viene modificato, dove il primo sta per arrivare modificato nella funzione di ordinamento, dove, perché è copy-on-write, ora una copia dell'esemplare sta per essere fatta. È anche possibile fare questo. Questo è l'altro posto è possibile vedere e commerciale. Lo vedi in loop foreach, si vede nelle dichiarazioni di funzione, e lo si vede quando solo l'assegnazione delle variabili. Ora abbiamo realizzato nulla in questo modo perché copia e le linee sono letteralmente la stessa cosa. È possibile utilizzare le linee e copiare in modo intercambiabile. Si può fare unset ($ copia), e che non le linee unset, basta perdere il riferimento alla stessa cosa. Quindi, a partire da questo punto, ora le linee è l'unico modo per accedere alle linee. Domande? Gia '. [Studente] Completamente fuori tema, ma non c'è bisogno di chiudere PHP con l'opzione - >> Non lo sai. Va bene. [Bowden] vorrei andare fino a dire che è cattiva pratica di chiuderle. Questo è probabilmente una esagerazione, soprattutto in uno script, ma vediamo cosa succede se faccio questo. Che non ha fatto nulla. E se io volessi - [sospira] Ho bisogno di passare un argomento. Spara. Ho chiamato sbagliato. Così php.unique.php con un argomento. Ora non ho nemmeno bisogno di questo. Io lo passare un argomento valido. Questo stampato qualunque cosa è la stampa. Sto stampa copia e la copia non esiste. Così le linee. E 'stampato tutto, e quindi osservare tutta questa spazzatura qui, perché in nulla PHP che è al di fuori dei tag PHP è solo andare da stampare letteralmente. Questo è il motivo per cui HTML, è così bello che io possa fare div bla, bla, bla classe o qualsiasi altra cosa, bla, bla, bla e poi fare un po 'di codice PHP e poi fare div fine. E ora la stampa di questo ho la mia bella div in alto, tutto ciò che PHP stampato, div in fondo. Disastroso quando qualcosa del genere accade, che è abbastanza comune, solo un ritorno a capo randagio nella parte inferiore del file. Non si potrebbe pensare che sarebbe stato un grosso affare se non si considera il fatto che con i browser - Come reindirizza lavoro o in pratica qualsiasi lavoro intestazioni, quando si effettua la connessione a un sito web e rimanda tutte queste intestazioni e cose come risposta 200 o risposta reindirizzare o qualsiasi altra cosa, intestazioni sono validi solo fino al primo byte di dati viene inviato. È possibile reindirizzare migliaia di volte, ma appena il primo byte di dati viene inviato non dovresti reindirizzare di nuovo. Se si dispone di un ritorno a capo randagio alla fine di un file e diciamo che si utilizza questa funzione e quindi si desidera - Diciamo che è un altro file che è index.php e require_once qualcosa - Non riesco a pensare ad un buon esempio di esso. Il problema si verifica quando questa riga in basso viene eco. Non voglio niente di essere stato ancora eco. Anche se non avete intenzione di ottenere qualcosa di eco, qualcosa è ottenere eco e così ora non dovresti inviare intestazioni più e si sta andando ad ottenere denunce. È solo che non bisogno di quei tag di chiusura. Se hai intenzione di fare qualcosa con HTML - ed è perfettamente ragionevole fare qui div qualunque e poi a questo punto si può o non si riesce a comprendere. Non ha molta importanza. Ma negli script PHP è raro per chiuderla. Quando tutto è PHP, ma proprio tutto, non si ha realmente bisogno per chiuderla / non si deve chiudere. Trattare con le stringhe è molto più bello in C. In PHP è possibile specificare una stringa con virgolette singole o doppie. Con apici non è possibile utilizzare le sequenze di "escape". Costantemente scappare, bla, bla, bla. Così printf è molto raro in PHP. Credo che avrei usato printf se volevo fare una cosa del genere - in pset 5 E 'utilizzato sprintf o qualsiasi altra cosa. Ma che vuoi fare e 001.jpg 002.jpg. Quindi, per questo genere di cose in cui ho effettivamente desidera formattare il testo vorrei usare printf. Ma per il resto vorrei solo usare la concatenazione di stringhe. Non ho mai davvero usare printf. Stiamo solo differenziando i dettagli tra apici singoli e doppi. La differenza più grande è che le virgolette singole, verrà stampato letteralmente. Non vi è alcun tipo di dati char in PHP, a differenza di C, quindi questo è equivalente a questa. Sono entrambe le stringhe. E la cosa bella di stringhe virgolette singole è che potrei dire 'Ciao mondo!' bla, bla, bla, $ $ Wooo. Che cosa succede quando si stampa questo è che lo stampa letteralmente. Liberiamoci di tutte le nostre cose. Così echo $ str1; E 'letteralmente stampata tutte queste cose: segni di dollaro, backslash n, che si potrebbe pensare che sarebbe a capo - tutte queste cose la stampa alla lettera. L'unica cosa che hai bisogno di fuggire sono i singoli apici perché altrimenti potrebbe pensare che sta chiudendo le virgolette singole. Le virgolette doppie, completamente diverse. Abbiamo già vedere l'evidenziazione della sintassi ci cluing a ciò che sta per andare storto. php.unique. Variabile non definita: wooo perché questo viene interpretato come una variabile chiamata wooo. Le virgolette doppie consentono di inserire le variabili in - Diciamo $ name = "Rob"; Così echo "Ciao, il mio nome è $ nome!"; Riconosce questa come variabile. Quando corro che - e mi inserisce un ritorno a capo - Ciao, il mio nome è Rob! e ciao a tutti! Questo perché non ho mai tolto la stampa di wooo sopra. C'è 1 ulteriore passo avanti si può fare. $ Array = [1, 2, 3]; Che cosa devo fare per stampare il primo indice dell'array? Tu fai $ array [0]. L'evidenziazione della sintassi è un indizio. Che cosa è questa intenzione di fare? php.unique. Ciao, il mio nome è 1! che non è quello che volevo. Evidenziazione della sintassi mi ha mentito. Proviamo 'a' -> 1, 'b' -> 2. È così che avrei dovuto scriverlo. Unexpected virgoletta singola (T_ENCAPSED bla, bla, bla, bla, bla). L'idea è che non è riconoscere questo come parte della matrice. Non è riconoscere questo come array indicizzato da una lettera. Vuoi farlo circondata da parentesi graffe, e ora tutto ciò che è in questa parentesi graffa viene interpolata, che è la parola che usiamo per l'inserimento di queste variabili magicamente nei posti giusti. Ora fare questo, php.unique, e Ciao, il mio nome è 1! come previsto o Ciao, il mio nome è Rob! Una cosa che una specie di bello di singoli apici è che - Ci sono un certo costo per l'interpolazione. Se si utilizzano le virgolette doppie, l'interprete deve andare oltre questa stringa, fare in modo che, "Oh, ecco una variabile. Ora ho bisogno di andare a prendere quella variabile e inserirla qui." Anche se non si utilizzano le variabili, non all'interno di queste virgolette deve essere interpolato, ma sarà ancora più lento, perché ha bisogno di andare oltre le doppie virgolette alla ricerca di cose che devono essere interpolati. Così virgolette singole può essere un po 'più veloce se non ha bisogno di essere interpolati, e tendo a usare anche le virgolette singole per, 'Ciao, il mio nome è'. $ Array ['a'] comunque. Che sta per essere equivalente a quello che avevamo prima. Ma è una questione di preferenze. Se si sta utilizzando PHP, probabilmente non si preoccupano la differenza di velocità. Non c'è abbastanza ragionare fuori per cominciare. Tutte le domande finali? In realtà non ha nemmeno a superare tutto questo, ma questa roba era noioso. L'ultima cosa che una specie di piacevole in PHP è quando hai a che fare con l'HTML, che servirà un po ', in modo che la sintassi bella scorciatoia per la stampa di una variabile. Senza mettere PHP qui, si parla di tag brevi. Ufficialmente da PHP 5.4, questo è deprecato. Si consiglia di mettere php. Questo è ancora supportato, i tag in modo da brevi con la