1 00:00:00,000 --> 00:00:02,610 [Powered by Google Translate] [Sezione 8 - più confortevole] 2 00:00:02,610 --> 00:00:04,910 [Rob Bowden - Harvard University] 3 00:00:04,910 --> 00:00:07,070 [Questo è CS50. - CS50.TV] 4 00:00:11,520 --> 00:00:14,160 >> Queste note di sezione settimane stanno per essere piuttosto breve, 5 00:00:14,160 --> 00:00:19,070 quindi sono solo andando a continuare a parlare, voi ragazzi stanno andando a continuare a chiedere domande, 6 00:00:19,070 --> 00:00:22,720 e cercheremo di riempire il tempo, per quanto possibile. 7 00:00:22,720 --> 00:00:31,950 Un sacco di gente pensa che questo pset non è necessariamente difficile, ma è molto lungo. 8 00:00:31,950 --> 00:00:37,070 Le specifiche pset si prende un'ora per leggere. 9 00:00:40,530 --> 00:00:45,730 Noi vi diamo un sacco di SQL di cui avete bisogno per l'uso. 10 00:00:45,730 --> 00:00:50,520 Ci si cammina attraverso un sacco di esso, quindi non dovrebbe essere troppo male. 11 00:00:50,520 --> 00:00:54,560 Qualcuno ha iniziato o finito? 12 00:00:55,380 --> 00:00:59,710 E 'l'ultima pset. Oh, mio ​​Dio.. 13 00:00:59,710 --> 00:01:05,400 Di solito c'è un JavaScript dopo che la presente, ma le cose cambiano di calendario 14 00:01:05,400 --> 00:01:09,560 rende tutto 1 settimana corta, e non abbiamo più un pset JavaScript. 15 00:01:09,560 --> 00:01:12,310 Non so come questo influenzi se JavaScript sta per apparire durante l'esame 16 00:01:12,310 --> 00:01:15,510 o Quiz 1. 17 00:01:15,510 --> 00:01:22,260 Immagino che sarà qualcosa di simile a quello che devi sapere cose di alto livello su JavaScript, 18 00:01:22,260 --> 00:01:26,460 ma dubito che avremmo solo dare retta codice JavaScript 19 00:01:26,460 --> 00:01:28,720 dal momento che non hanno avuto un pset in esso. 20 00:01:28,720 --> 00:01:33,000 Ma che sarà roba per la revisione quiz prossima settimana. 21 00:01:33,000 --> 00:01:36,320 >> Sezione di domande. 22 00:01:36,320 --> 00:01:43,870 Un sacco di questa roba è un po 'mal formulata, ma parleremo perché. 23 00:01:43,870 --> 00:01:50,220 A differenza di C, PHP è un linguaggio "dinamicamente tipizzato". Cosa significa, vi chiederete? 24 00:01:50,220 --> 00:01:53,830 Beh, dì addio a tutti quelli char, float, int, e altre parole chiave è necessario utilizzare 25 00:01:53,830 --> 00:01:56,190 quando si dichiarano variabili e funzioni in C. 26 00:01:56,190 --> 00:02:00,420 In PHP, il tipo di una variabile è determinata dal valore che è attualmente in possesso. 27 00:02:00,420 --> 00:02:04,990 Quindi, prima di scrivere il codice in un file chiamato dynamic.php, 28 00:02:04,990 --> 00:02:12,670 PHP è dinamicamente tipizzati. Questo è vero. 29 00:02:12,670 --> 00:02:17,590 Non sono d'accordo con il fatto che che significa che stiamo dicendo addio a char, float, int, 30 00:02:17,590 --> 00:02:20,620 e altre parole chiave. 31 00:02:20,620 --> 00:02:25,510 La differenza esatta tra tipizzazione dinamica e l'alternativa, 32 00:02:25,510 --> 00:02:32,010 che è staticamente tipizzato, è che dinamicamente tipizzati, tutto il vostro controllo del tipo e materiale 33 00:02:32,010 --> 00:02:37,350 accade in fase di esecuzione, mentre staticamente tipizzato accade in fase di compilazione. 34 00:02:37,350 --> 00:02:43,030 La parola statica, in generale, sembra voler dire le cose in fase di compilazione. 35 00:02:43,030 --> 00:02:48,170 Credo che ci sono altri usi per essa, ma in C quando si dichiara una variabile statica, 36 00:02:48,170 --> 00:02:52,650 la sua memoria viene allocata al momento della compilazione. 37 00:02:52,650 --> 00:02:59,260 Qui, dinamicamente tipizzati significa solo che - 38 00:02:59,260 --> 00:03:04,350 In C, se si tenta di aggiungere una stringa e un intero, durante la compilazione, 39 00:03:04,350 --> 00:03:11,000 sta andando a lamentarsi perché sta andando a dire che non è possibile aggiungere un int e un puntatore. 40 00:03:11,000 --> 00:03:14,710 Non è solo un'operazione valida. 41 00:03:14,710 --> 00:03:21,170 Questa è un'altra cosa che ci arriveremo in un secondo. 42 00:03:21,170 --> 00:03:24,860 Ma quel tipo di controllo, il fatto che si lamenta in fase di compilazione, 43 00:03:24,860 --> 00:03:29,220 è il controllo di tipo statico. 44 00:03:29,220 --> 00:03:35,220 Ci sono lingue in cui non c'è bisogno di dire char, float, int, e tutte queste cose, 45 00:03:35,220 --> 00:03:40,940 ma la lingua può dire dal contesto della cosa tipo che dovrebbe essere, 46 00:03:40,940 --> 00:03:43,980 ma è ancora staticamente tipizzato. 47 00:03:43,980 --> 00:03:49,000 Quindi, se si prende 51, OCaml, non è necessario utilizzare uno di questi tipi, 48 00:03:49,000 --> 00:03:58,700 ma ancora in fase di compilazione si dice che non si può fare questo perché si sta mixando un int e una stringa. 49 00:03:58,700 --> 00:04:05,650 Dinamicamente digitato significa solo che in qualche momento durante la fase di esecuzione si sta andando a prendere un reclamo. 50 00:04:05,650 --> 00:04:13,430 Se è stato utilizzato anche Java prima, in generale, quasi tutti i C-tipo di linguaggio 51 00:04:13,430 --> 00:04:20,070 sta per essere staticamente tipizzato, in modo da C, C + +, Java, tutti coloro che sono generalmente staticamente tipizzato. 52 00:04:20,070 --> 00:04:22,910 In Java quando si compila qualcosa e stai dicendo 53 00:04:22,910 --> 00:04:26,670 stringa s è uguale a qualcosa di nuovo che non è una stringa, 54 00:04:26,670 --> 00:04:28,950 che sta andando a lamentarsi fatto che questi tipi semplicemente non all'altezza. 55 00:04:28,950 --> 00:04:31,180 Quello sta andando a lamentarsi in fase di compilazione. 56 00:04:31,180 --> 00:04:36,750 Ma ha anche un po 'di tempo dinamico le cose come se si tenta di lanciare qualcosa 57 00:04:36,750 --> 00:04:40,500 di un tipo che è più specifico del suo tipo corrente, 58 00:04:40,500 --> 00:04:45,610 non c'è niente che possa fare al momento della compilazione di verificare se tale fusione sta per avere successo. 59 00:04:45,610 --> 00:04:51,130 Java ha anche un certo tipo di controllo dinamico che appena si arriva a tale riga di codice 60 00:04:51,130 --> 00:04:54,130 quando in realtà è in esecuzione, è andare a fare il cast, 61 00:04:54,130 --> 00:04:56,260 verificare se tale cast era valida, in primo luogo, 62 00:04:56,260 --> 00:04:59,890 e se non lo era, allora sta andando a lamentarsi di avere un tipo non valido. 63 00:04:59,890 --> 00:05:03,200 Tipo di controllo dinamico. 64 00:05:03,200 --> 00:05:07,010 Digitare questo in un file chiamato dynamic.php. 65 00:05:10,130 --> 00:05:12,380 Dynamic.php. 66 00:05:14,580 --> 00:05:17,190 Io decomprimere che la formattazione. 67 00:05:18,750 --> 00:05:21,880 Abbiamo una variabile, abbiamo impostato il numero intero 7, 68 00:05:21,880 --> 00:05:27,930 poi andremo a stampare e% s - 69 00:05:27,930 --> 00:05:32,830 Oh, stiamo stampando il tipo di esso, in modo gettype sta per restituire il tipo della variabile. 70 00:05:32,830 --> 00:05:35,720 Stiamo solo la stampa del tipo più e più volte. 71 00:05:35,720 --> 00:05:39,440 Abbiamo appena php.dynamic.php. 72 00:05:39,440 --> 00:05:45,920 Vedremo che varia da intero a stringa in Boolean come si attraversano. 73 00:05:45,920 --> 00:05:54,590 In C non esiste un tipo di dati Boolean, non c'è nessun tipo di dati stringa. 74 00:05:54,590 --> 00:06:00,500 Ci sono char * e Boolean tende solo per essere int o char o qualcosa del genere. 75 00:06:00,500 --> 00:06:05,690 In PHP esistono questi tipi, e questo è uno dei grandi vantaggi di PHP oltre C - 76 00:06:05,690 --> 00:06:13,290 che le operazioni di stringa sono infinitamente più facile in PHP di C. solo di lavoro. 77 00:06:13,290 --> 00:06:18,290 >> Così siamo tornati qui. 78 00:06:18,290 --> 00:06:21,260 Corremmo dynamic.php. 79 00:06:21,260 --> 00:06:26,710 Questo dice l'interprete PHP, chiamata php, per eseguire il codice PHP in dynamic.php. 80 00:06:26,710 --> 00:06:30,250 In caso di errori nel file, l'interprete vi dirà! 81 00:06:30,250 --> 00:06:39,110 L'interprete, questo è un altro grande differenza tra PHP e C. 82 00:06:39,110 --> 00:06:48,200 In C è necessario compilare qualcosa e quindi si esegue il file compilato. 83 00:06:48,200 --> 00:06:50,490 In PHP non si compila nulla. 84 00:06:50,490 --> 00:06:57,200 Così l'interprete PHP è fondamentalmente solo la lettura di questo riga per riga. 85 00:06:57,200 --> 00:07:02,900 Colpisce var = 7 poi colpisce printf poi colpisce var poi colpisce printf e così via. 86 00:07:02,900 --> 00:07:10,910 C'è un po 'di compilare lo fa, e memorizza nella cache i risultati 87 00:07:10,910 --> 00:07:15,510 quindi se si esegue lo script in seguito è possibile fare un po ', 88 00:07:15,510 --> 00:07:19,280 ma in fondo si tratta di una linea per linea sorta di cose. 89 00:07:19,280 --> 00:07:25,280 Ciò significa che un sacco di ottimizzazioni che si ottiene in C, 90 00:07:25,280 --> 00:07:31,920 come la compilazione, è solo in generale il compilatore può fare un sacco di trucchi per voi. 91 00:07:31,920 --> 00:07:36,110 Si può estrarre le variabili non utilizzate, si può fare tutto questo genere di cose, 92 00:07:36,110 --> 00:07:38,660 che può fare la ricorsione in coda. 93 00:07:38,660 --> 00:07:42,550 In PHP non avete intenzione di ottenere tale vantaggio 94 00:07:42,550 --> 00:07:45,690 perché è solo andare per avviare l'esecuzione riga per riga per riga, 95 00:07:45,690 --> 00:07:49,950 e in realtà non riconoscere queste cose come facilmente 96 00:07:49,950 --> 00:07:54,440 dal momento che non è 1 grande passaggio di compilazione sulla cosa e poi l'esecuzione; 97 00:07:54,440 --> 00:07:56,860 è solo riga per riga. 98 00:08:00,730 --> 00:08:02,750 Ecco, questo è l'interprete. 99 00:08:02,750 --> 00:08:06,840 >> Torna alla nostra tipizzazione dinamica: abbastanza freddo, eh? 100 00:08:06,840 --> 00:08:08,640 Lei sicuramente non poteva farlo in C! 101 00:08:08,640 --> 00:08:11,860 Ora, vedere se si riesce a capire il tipo di ciascuno dei seguenti valori. 102 00:08:11,860 --> 00:08:14,760 Vedere questo per riferimento. 103 00:08:14,760 --> 00:08:19,420 Quindi 3.50. Che tipo pensi che sarà? 104 00:08:24,480 --> 00:08:26,370 Qui ci sono i tipi che abbiamo. 105 00:08:26,370 --> 00:08:30,430 Abbiamo Caccio, numeri interi, virgola mobile, stringhe, array, oggetti, 106 00:08:30,430 --> 00:08:38,370 e poi risorse, che è una specie di vaga. 107 00:08:38,370 --> 00:08:41,010 Penso che ci sia in realtà un esempio qui. 108 00:08:41,010 --> 00:08:43,740 Poi c'è NULL. NULL è un tipo speciale. 109 00:08:43,740 --> 00:08:47,140 A differenza di C dove NULL è solo un puntatore con l'indirizzo 0, 110 00:08:47,140 --> 00:08:54,930 in PHP, NULL è proprio tipo in cui l'unica cosa valida di quel tipo è NULL. 111 00:08:57,560 --> 00:09:00,670 Questo è molto più utile per il controllo degli errori. 112 00:09:00,670 --> 00:09:04,310 In C dove abbiamo avuto questo problema per il quale se si torna NULL, 113 00:09:04,310 --> 00:09:08,660 vuol dire che stai restituendo un puntatore NULL o utilizzando NULL per indicare errore 114 00:09:08,660 --> 00:09:12,380 o di tutta quella confusione che abbiamo avuto ad un certo punto. 115 00:09:12,380 --> 00:09:18,440 Qui, di ritorno NULL generalmente significa errore. 116 00:09:20,860 --> 00:09:27,300 Un sacco di cose anche restituire false per errore. 117 00:09:27,300 --> 00:09:33,140 Ma il punto è il tipo NULL, l'unica cosa del tipo NULL è NULL. 118 00:09:33,140 --> 00:09:40,090 Poi callback è come è possibile definire alcune funzioni anonime. 119 00:09:40,090 --> 00:09:46,420 Non è necessario dare la funzione di un nome, ma non avranno a che fare con questo qui. 120 00:09:46,420 --> 00:09:53,940 Guardando i tipi che essi si aspettano di conoscere, 121 00:09:53,940 --> 00:09:59,000 cosa ne pensate del tipo di 3.50 è? >> [Studente] Float. 122 00:09:59,000 --> 00:10:00,370 Gia '. 123 00:10:00,370 --> 00:10:06,290 Allora qui, cosa ne pensi del tipo di questo? >> [Studente] Array. 124 00:10:06,290 --> 00:10:09,890 Gia '. Il primo era galleggiante, il secondo è un array. 125 00:10:09,890 --> 00:10:14,500 Si noti che questa matrice non è come un array C 126 00:10:14,500 --> 00:10:19,610 dove si ha l'indice 0 ha un certo valore, indice 1 ha un certo valore. 127 00:10:19,610 --> 00:10:26,320 Qui sono gli indici a, b, e c ed i valori sono 1, 2, e 3. 128 00:10:26,320 --> 00:10:33,980 In PHP non vi è alcuna differenza tra un array associativo e solo una serie regolare 129 00:10:33,980 --> 00:10:36,740 come si potrebbe pensare di esso in C. 130 00:10:36,740 --> 00:10:43,040 C'è solo questo, e sotto il cofano una serie regolare è solo un array associativo 131 00:10:43,040 --> 00:10:50,000 dove 0 mappe per un valore allo stesso modo di un mapping a un certo valore. 132 00:10:50,000 --> 00:11:00,410 Per questo motivo, PHP può essere piuttosto male per davvero veloci codice / benchmarking cose 133 00:11:00,410 --> 00:11:07,930 dal momento che in C quando si utilizza una matrice a sapere che l'accesso a un membro è costante di tempo. 134 00:11:07,930 --> 00:11:11,860 In PHP l'accesso a un utente è che sa quanto tempo? 135 00:11:11,860 --> 00:11:18,970 E 'probabilmente costante se gli hash correttamente. 136 00:11:18,970 --> 00:11:21,620 Chi sa che cosa sta facendo veramente sotto il cofano? 137 00:11:21,620 --> 00:11:25,600 Hai davvero bisogno di guardare l'attuazione per vedere come sta andando a che fare con questo. 138 00:11:25,600 --> 00:11:28,550 Allora fopen. 139 00:11:28,550 --> 00:11:36,420 Penso che qui facciamo solo PHP fopen manuale a guardare il tipo restituito. 140 00:11:36,420 --> 00:11:41,260 Vediamo qui è possibile cercare praticamente qualsiasi funzione nel manuale PHP 141 00:11:41,260 --> 00:11:47,540 e questa è una sorta di pagina di manuale di PHP. 142 00:11:47,540 --> 00:11:51,060 Il tipo di ritorno sta per essere risorsa. 143 00:11:51,060 --> 00:11:56,050 È per questo che ho cercato, perché non abbiamo davvero definire risorse. 144 00:11:56,050 --> 00:12:04,110 L'idea di risorsa, in C si ha una sorta di * FILE o qualsiasi altra cosa; 145 00:12:04,110 --> 00:12:07,200 in PHP la risorsa è il tuo * FILE. 146 00:12:07,200 --> 00:12:10,360 E 'quello che si sta andando ad essere la lettura, è quello che si sta andando ad essere la scrittura. 147 00:12:10,360 --> 00:12:20,710 Di solito è esterna, quindi è una risorsa che può tirare le cose da e gettare le cose a. 148 00:12:20,710 --> 00:12:26,520 E, infine, qual è il tipo di NULL? >> [Studente] NULL. 149 00:12:26,520 --> 00:12:30,650 Gia '. Quindi l'unica cosa che è NULL è NULL. 150 00:12:30,650 --> 00:12:33,480 NULL è NULL. 151 00:12:35,490 --> 00:12:41,170 >> Una caratteristica del sistema di tipi di PHP (nel bene e nel male) è la sua capacità di destreggiarsi tra i tipi. 152 00:12:41,170 --> 00:12:44,390 Quando si scrive una riga di codice PHP che unisce valori di tipi diversi, 153 00:12:44,390 --> 00:12:46,670 PHP cercherà di fare la cosa più sensata. 154 00:12:46,670 --> 00:12:48,920 Provare di ciascuna delle seguenti righe di codice PHP. Cosa stampato? 155 00:12:48,920 --> 00:12:51,000 E 'quello che ti aspettavi? Perché o perché no? 156 00:12:51,000 --> 00:12:58,600 Questo fatto di PHP è quello che fa ciò che noi chiamiamo debolmente tipizzato. 157 00:12:58,600 --> 00:13:04,610 Debolmente tipizzato e fortemente tipizzati, 158 00:13:04,610 --> 00:13:06,840 esistono diversi usi di tali termini, 159 00:13:06,840 --> 00:13:12,020 ma la maggior parte delle persone usano debolmente tipizzato e fortemente tipizzati per indicare questo genere di cose 160 00:13:12,020 --> 00:13:15,920 dove ("1" + 2), che funziona. 161 00:13:15,920 --> 00:13:18,290 In C che non avrebbe funzionato. 162 00:13:18,290 --> 00:13:22,490 È possibile immaginare che questo non funziona. 163 00:13:22,490 --> 00:13:29,200 Un sacco di persone si mescolano tipizzazione dinamica e la tipizzazione debole e tipizzazione statica e la tipizzazione forte. 164 00:13:29,200 --> 00:13:34,050 Python è un altro esempio di un linguaggio che è dinamicamente tipizzati. 165 00:13:34,050 --> 00:13:41,770 Si può buttare in giro per i tipi di variabili e che sta per determinare in fase di esecuzione 166 00:13:41,770 --> 00:13:44,680 Riscontri eventuali errori. 167 00:13:44,680 --> 00:13:50,740 In Python che sta per eseguire questo e vedrà ("1" + 2); 168 00:13:50,740 --> 00:13:55,920 e questo non perché dice che non è possibile aggiungere una stringa e un intero. 169 00:13:55,920 --> 00:14:00,860 In PHP, che è altrettanto dinamicamente tipizzati, questo non mancherà. 170 00:14:00,860 --> 00:14:04,220 Tipizzazione debole ha a che fare con il fatto che si fa cose con tipi 171 00:14:04,220 --> 00:14:07,800 che in realtà non ha senso necessariamente. 172 00:14:07,800 --> 00:14:17,420 So ("1" + 2), posso immaginare che sia la stringa di 12, posso immaginare che sia la stringa 3, 173 00:14:17,420 --> 00:14:20,710 Posso immaginare che sia il numero intero 3. 174 00:14:20,710 --> 00:14:24,530 Non è necessariamente ben definita, e noi probabilmente stai andando a vedere qui 175 00:14:24,530 --> 00:14:29,140 che quando si stampa ("1" + 2), ma è probabilmente andando a finire per essere differente 176 00:14:29,140 --> 00:14:32,320 di stampa (1 + "2"). 177 00:14:32,320 --> 00:14:39,700 E questo tende ad essere, a mio parere, in peggio. 178 00:14:39,700 --> 00:14:44,240 Qui siamo in grado di provare questi. 179 00:14:44,240 --> 00:14:48,740 Un altro trucco poco di PHP è che non c'è bisogno di scrivere effettivamente il file. 180 00:14:48,740 --> 00:14:52,790 Lo fa hanno eseguito questa modalità di comando. 181 00:14:52,790 --> 00:14:57,710 Così php-r, allora possiamo buttare nel comando qui: 182 00:14:57,710 --> 00:15:06,610 "Stampare ('1 '+ 2),« e mi butto una nuova linea. 183 00:15:19,550 --> 00:15:23,970 Questo stampato 3. 184 00:15:31,100 --> 00:15:35,330 Sembra che la stampa 3 ed è il numero intero 3. 185 00:15:35,330 --> 00:15:38,420 Così ora proviamo il contrario: 186 00:15:38,420 --> 00:15:42,970 "Stampare (1 + '2 '); 187 00:15:45,560 --> 00:15:50,490 Otteniamo 3, e lo sta anche andando a essere un numero intero 3? Onestamente non hanno idea. 188 00:15:50,490 --> 00:15:54,030 Sembra che sia coerente. 189 00:15:54,030 --> 00:15:59,550 Non c'è alcuna possibilità di esso che è la 12 corde o cose del genere 190 00:15:59,550 --> 00:16:08,080 perché PHP, a differenza di JavaScript e Java troppo, 191 00:16:08,080 --> 00:16:11,670 ha un operatore separato per la concatenazione. 192 00:16:11,670 --> 00:16:14,930 Concatenazione in PHP è dot. 193 00:16:14,930 --> 00:16:22,950 Così la stampa (1 '2 '.), Sta per dare a noi 12. 194 00:16:25,790 --> 00:16:32,420 Questo tende a creare confusione in cui le persone cercano di fare qualcosa di simile str + = 195 00:16:32,420 --> 00:16:37,840 qualche altra cosa che si desidera aggiungere al fine del loro stringa, e che sta per fallire. 196 00:16:37,840 --> 00:16:40,770 Hai bisogno di fare str. = 197 00:16:42,000 --> 00:16:46,240 Quindi non dimenticate di concatenazione in PHP è un punto. 198 00:16:46,240 --> 00:16:52,100 Altre cose da provare: print ("CS" + 50); 199 00:16:55,750 --> 00:17:03,610 Te l'ho detto che non vi è alcuna speranza di questo risultato CS50 200 00:17:03,610 --> 00:17:06,119 poiché non è concatenazione +. 201 00:17:06,119 --> 00:17:08,440 Cosa ne pensi questo sta per finire per essere? 202 00:17:10,359 --> 00:17:13,460 Onestamente ho assolutamente idea. 203 00:17:14,250 --> 00:17:16,460 Sembra che solo 50. 204 00:17:16,460 --> 00:17:21,490 Si vede la stringa, e scommetto che se mettiamo 123CS - 205 00:17:21,490 --> 00:17:29,640 Si vede la prima stringa, tenta di leggere un numero intero da esso o un numero da esso. 206 00:17:29,640 --> 00:17:31,710 In questo caso si vede 123CS. 207 00:17:31,710 --> 00:17:35,190 "Non ha senso come un intero, quindi sto solo andando a pensare a 123." 208 00:17:35,190 --> 00:17:38,580 Quindi 123 + 50 sta per essere 173. 209 00:17:38,580 --> 00:17:40,740 E qui comincia la lettura di questo come un numero intero. 210 00:17:40,740 --> 00:17:45,690 Non vede nulla, in modo che la tratta semplicemente come 0. Quindi 0 + 50 sta per essere 50. 211 00:17:45,690 --> 00:17:51,600 Questo Sto assumendo sta per fare qualcosa di simile. 212 00:17:51,600 --> 00:17:54,310 Sto pensando 99. 213 00:17:54,310 --> 00:17:57,580 Già, perché sta andando a prendere la prima - 214 00:18:12,880 --> 00:18:15,730 Così 99. 215 00:18:15,730 --> 00:18:21,970 Qui (10/7), se questo fosse C, cosa che restituiscono? 216 00:18:23,700 --> 00:18:29,630 [Studente] 1. >> Si ', sarebbe 1 in quanto il 10/7 è dividere 2 numeri interi. 217 00:18:29,630 --> 00:18:32,910 Un numero intero diviso per un numero intero sta per restituire un numero intero. 218 00:18:32,910 --> 00:18:37,750 Non si può tornare: 1 per qualsiasi punto che sarebbe stato, quindi è solo andando a restituire 1. 219 00:18:37,750 --> 00:18:46,120 Qui la stampa (10/7), che sta per interpretare effettivamente tale. 220 00:18:46,120 --> 00:18:53,760 E questo significa che se si vuole realmente fare arrotondamento intero e cose del genere, 221 00:18:53,760 --> 00:18:59,950 quello che devi fare di stampa (piano (10/7)); 222 00:18:59,950 --> 00:19:08,460 In C è probabilmente strano che si può contare su troncamento intero regolarmente, 223 00:19:08,460 --> 00:19:12,260 ma in PHP non è possibile perché sarà automaticamente trasformarsi in un float. 224 00:19:13,430 --> 00:19:17,610 E poi (7 + true); cosa pensi che sarà? 225 00:19:18,550 --> 00:19:23,640 Sto indovinando 8 se sta andando a interpretare come 1 vero. 226 00:19:23,640 --> 00:19:25,740 Sembra come se fosse 8. 227 00:19:25,740 --> 00:19:31,710 >> Quindi, tutto ciò che abbiamo fatto negli ultimi 10 minuti si dovrebbe assolutamente mai fare. 228 00:19:31,710 --> 00:19:39,870 Vedrete il codice che fa questo. 229 00:19:39,870 --> 00:19:42,700 Non deve essere semplice come questo. 230 00:19:42,700 --> 00:19:47,240 Si potrebbe avere 2 variabili, e 1 variabile sembra essere una stringa 231 00:19:47,240 --> 00:19:51,310 e l'altra variabile sembra essere un int, e quindi si aggiunge queste variabili insieme. 232 00:19:51,310 --> 00:20:00,120 Poiché PHP dinamicamente tipizzati e non farà alcun tipo di controllo per voi 233 00:20:00,120 --> 00:20:03,640 e dal momento che è debolmente tipizzato e dal momento che sarà solo buttare automaticamente queste cose insieme 234 00:20:03,640 --> 00:20:11,490 e tutto solo di lavoro, è difficile sapere anche che questa variabile deve essere una stringa ora, 235 00:20:11,490 --> 00:20:14,930 quindi non dovrei aggiungere a questa variabile, che è un numero intero. 236 00:20:18,780 --> 00:20:24,560 Le migliori pratiche è se una variabile è una stringa, tenerlo come una stringa per sempre. 237 00:20:24,560 --> 00:20:26,980 Se una variabile è di tipo int, tenerlo come un int per sempre. 238 00:20:26,980 --> 00:20:30,770 Se si vuole affrontare con i numeri interi e stringhe, 239 00:20:30,770 --> 00:20:36,970 è possibile utilizzare varsint - che è JavaScript. 240 00:20:36,970 --> 00:20:42,520 Intval. Lo faccio tutto il tempo. PHP e JavaScript mescolo tutto. 241 00:20:42,520 --> 00:20:47,600 Così intval sta per restituire il valore intero di una variabile. 242 00:20:47,600 --> 00:20:56,550 Se si passa a "stampare (intval ('123 ')), si ottiene 123. 243 00:21:06,820 --> 00:21:15,850 Intval sé non ha intenzione di fare il controllo per noi che è esclusivamente un numero intero. 244 00:21:15,850 --> 00:21:20,460 Il manuale PHP, ci sono così tante funzioni disponibili, 245 00:21:20,460 --> 00:21:26,560 ecco penso che quello che uso è is_numeric primo. 246 00:21:26,560 --> 00:21:32,590 Sto indovinando che ha restituito false. 247 00:21:32,590 --> 00:21:35,780 Questa è un'altra cosa che dobbiamo andare oltre è ===. 248 00:21:37,850 --> 00:21:44,020 Così is_numeric ('123df '), non si potrebbe pensare a questo come a is_numeric. 249 00:21:44,020 --> 00:21:46,720 In C si dovrebbe iterare su tutti i caratteri 250 00:21:46,720 --> 00:21:50,410 e verificare se ogni carattere corrisponde al numero o qualsiasi altra cosa. 251 00:21:50,410 --> 00:21:53,850 Qui is_numeric sta andando a fare per noi, 252 00:21:53,850 --> 00:21:56,520 ed è restituito false. 253 00:21:56,520 --> 00:22:02,120 Così, quando ho stampato questo, stampato nulla, ecco: sto per vedere, 254 00:22:02,120 --> 00:22:05,490 le è capitato di essere falso? E così ora è la stampa 1. 255 00:22:05,490 --> 00:22:10,060 A quanto pare la stampa 1 come vera invece di stampare vero come vero. 256 00:22:10,060 --> 00:22:15,790 Mi chiedo se lo faccio print_r. No, lo fa ancora 1. 257 00:22:15,790 --> 00:22:26,760 >> Tornando ===, == esiste ancora, 258 00:22:26,760 --> 00:22:32,260 e se si parla di Tommy dirà == è perfettamente bene. 259 00:22:32,260 --> 00:22:37,700 Io vado a dire che == è terribile e non si dovrebbe mai usare ==. 260 00:22:37,700 --> 00:22:44,870 La differenza è che le cose a confronto == 261 00:22:44,870 --> 00:22:48,450 dove può essere vero, anche se non sono dello stesso tipo, 262 00:22:48,450 --> 00:22:53,810 che mette a confronto le cose e === Prima di tutto verifica che sono dello stesso tipo? 263 00:22:53,810 --> 00:22:58,010 Sì. Ok, ora vado a vedere se effettivamente paragonare ad essere uguali. 264 00:22:58,010 --> 00:23:08,890 È possibile ottenere cose strane come 10 è uguale a - Vediamo cosa che dice. 265 00:23:08,890 --> 00:23:15,570 Quindi ('10 '== '1 e1'); 266 00:23:15,570 --> 00:23:17,980 Questo restituisce true. 267 00:23:17,980 --> 00:23:21,420 Qualcuno ha qualche ipotesi perché questo restituisce true? 268 00:23:25,180 --> 00:23:27,120 Non si tratta solo di questo. Forse questo è un suggerimento. 269 00:23:27,120 --> 00:23:33,170 Ma se cambio che per un f - è dannatamente! Continuo ad usare le virgolette doppie. 270 00:23:33,170 --> 00:23:38,780 La ragione per cui le virgolette sono inveire contro di me è perché ho messo questo tra virgolette doppie. 271 00:23:38,780 --> 00:23:43,850 Così ho potuto evitare le doppie virgolette in qui, ma le virgolette singole rendere più facile. 272 00:23:43,850 --> 00:23:49,120 Quindi ('10 '== '1 f1'); non stampa vero. ('10 '== '1 E1'); stampa vera. 273 00:23:49,120 --> 00:23:56,330 [Studente] E 'hex? >> Non è esadecimale, ma è vicino che è come - 274 00:23:56,330 --> 00:24:01,060 1e1, notazione scientifica. 275 00:24:01,060 --> 00:24:07,950 Riconosce 1e1 come 1 * 10 ^ 1 o qualsiasi altra cosa. 276 00:24:07,950 --> 00:24:11,510 Quelli sono interi uguali. 277 00:24:11,510 --> 00:24:15,930 Se facciamo === allora sarà falsa. 278 00:24:15,930 --> 00:24:28,490 Io in realtà non hanno alcuna idea se facciamo == che dire (10 e '10abc ');? Bene. Ecco, questo è vero. 279 00:24:28,490 --> 00:24:35,940 Quindi, proprio come quando hai fatto (10 + '10abc '), e che sarebbe stato 20, 280 00:24:35,940 --> 00:24:38,800 qui (10 == '10abc '); è vero. 281 00:24:38,800 --> 00:24:45,350 Ancora peggio sono cose come (false == NULL); è vero 282 00:24:45,350 --> 00:24:52,210 o (false == 0), è vero, (false == []); 283 00:24:52,210 --> 00:25:00,970 Ci sono casi di strane - Questo è uno di quei casi strani. 284 00:25:00,970 --> 00:25:08,110 Si noti che (false == []), è vero. 285 00:25:08,110 --> 00:25:11,950 ('0 '== False), è vero. 286 00:25:11,950 --> 00:25:16,090 ('0 '== []), È falso. 287 00:25:16,090 --> 00:25:19,090 Così == è in alcun modo transitivo. 288 00:25:19,090 --> 00:25:26,830 una può essere uguale a B e può essere uguale a C, 289 00:25:26,830 --> 00:25:29,340 b ma potrebbe non essere uguale a c. 290 00:25:29,340 --> 00:25:35,580 Questo è un abominio per me, e si dovrebbe sempre usare. === 291 00:25:35,580 --> 00:25:38,590 [Studente] Possiamo fare! == Come bene? >> [Bowden] Sì. 292 00:25:38,590 --> 00:25:44,600 L'equivalente sarebbe! = E! ==. 293 00:25:44,600 --> 00:25:48,230 Questo è in realtà cresciuto nelle specifiche pset 294 00:25:48,230 --> 00:25:52,000 dove un sacco di funzioni di ritorno - 295 00:25:52,000 --> 00:25:53,890 Il manuale PHP è buono su questo. 296 00:25:53,890 --> 00:25:59,140 Si mette in una grande scatola rossa, "Questo restituirà false se c'è un errore." 297 00:25:59,140 --> 00:26:03,940 Ma tornando 0 è una cosa perfettamente ragionevole per tornare. 298 00:26:03,940 --> 00:26:08,250 Pensate a qualsiasi funzione che dovrebbe restituire un intero. 299 00:26:11,250 --> 00:26:17,880 Diciamo che questa funzione dovrebbe contare il numero di righe in un file o qualcosa del genere. 300 00:26:17,880 --> 00:26:23,490 In circostanze normali, si passa a questa funzione di un file 301 00:26:23,490 --> 00:26:27,120 e sta andando restituiscono un numero intero che rappresenta il numero di righe. 302 00:26:27,120 --> 00:26:30,820 Quindi 0 è un numero del tutto ragionevole se il file è solo vuoto. 303 00:26:30,820 --> 00:26:36,810 Ma cosa succede se si passa un file non valido e la funzione avviene per restituire false 304 00:26:36,810 --> 00:26:38,860 se si passa un file non valido? 305 00:26:38,860 --> 00:26:46,500 Se solo non == non sei differenziare il caso tra file non valido e il file vuoto. 306 00:26:48,870 --> 00:26:51,350 Utilizzare sempre ===. 307 00:26:55,690 --> 00:26:58,000 E 'tutto di quelli. 308 00:26:58,000 --> 00:27:01,660 >> In PHP, il tipo di matrice è diverso da quello a cui siete abituati in C. 309 00:27:01,660 --> 00:27:06,650 In effetti, si può avere già notato in precedenza, quando si è visto che questo è di tipo array. 310 00:27:06,650 --> 00:27:15,640 La sintassi staffa è nuova a partire da PHP 5.4, che è l'ultima versione di PHP. 311 00:27:15,640 --> 00:27:36,960 Prima di questo è sempre dovuto scrivere array ('a' -> 1, 'b' -> 2. 312 00:27:36,960 --> 00:27:41,160 Questo è stato il costruttore per un array. 313 00:27:41,160 --> 00:27:45,950 Oggi PHP è finalmente arrivato intorno alla sintassi bella di soli parentesi quadre, 314 00:27:45,950 --> 00:27:50,900 che è solo molto meglio di array. 315 00:27:50,900 --> 00:27:54,480 Ma considerando PHP 5.4 è la versione più recente, 316 00:27:54,480 --> 00:27:59,090 si possono incontrare luoghi che non hanno nemmeno PHP 5.3. 317 00:27:59,090 --> 00:28:08,220 Durante l'estate ci siamo imbattuti in questo problema per il quale PHP 5.3 era quello che abbiamo avuto l'apparecchio, 318 00:28:08,220 --> 00:28:14,480 ma il server che abbiamo distribuito tutti i nostri libri grado e presentare e tutta quella roba a 319 00:28:14,480 --> 00:28:16,750 PHP era 5,4. 320 00:28:16,750 --> 00:28:23,060 Non sapendo questo, abbiamo sviluppato al punto 5.3, ha spinto a 5,4, 321 00:28:23,060 --> 00:28:25,660 e ora tutto ad un tratto nessuno del nostro codice funziona 322 00:28:25,660 --> 00:28:28,680 perché ci è accaduto di essere stato modifiche tra 5.3 e 5.4 323 00:28:28,680 --> 00:28:31,030 che non sono compatibili, 324 00:28:31,030 --> 00:28:35,770 e dobbiamo andare a risolvere tutte le nostre cose che non funzionano per PHP 5.4. 325 00:28:39,210 --> 00:28:42,320 Per questa classe, poiché l'apparecchio ha ancora PHP 5,4, 326 00:28:42,320 --> 00:28:45,490 va benissimo usare le parentesi quadre. 327 00:28:47,240 --> 00:28:50,440 Ma se stai cercando le cose su Internet, 328 00:28:50,440 --> 00:28:54,880 se stai cercando un qualche tipo di cose serie, molto probabilmente si sta andando a vedere 329 00:28:54,880 --> 00:29:02,020 l'incantesimo su sintassi di matrice dal costruttore che è stato intorno dal PHP è nato 330 00:29:02,020 --> 00:29:07,340 e sintassi parentesi quadra è stato intorno per i mesi ultimi due 331 00:29:07,340 --> 00:29:10,020 o ogni volta che 5,4 è venuto intorno. 332 00:29:10,020 --> 00:29:12,710 Questo è il modo di indice. 333 00:29:12,710 --> 00:29:30,610 Proprio come in C come se fosse indice tra parentesi quadre come $ array [0], $ array [1], $ array [2], 334 00:29:30,610 --> 00:29:36,320 è indice allo stesso modo se vi capita di avere i vostri indici di essere stringhe. 335 00:29:36,320 --> 00:29:40,440 Quindi, $ array ['a'] e $ array ['b']. 336 00:29:40,440 --> 00:29:47,410 $ Array [b]. Perché questo sarebbe sbagliato? 337 00:29:52,490 --> 00:29:59,870 Sarà probabilmente generato un avviso, ma funzionano ancora. PHP tende a farlo. 338 00:29:59,870 --> 00:30:04,890 Esso tende a solo, "ho intenzione di mettervi in ​​guardia su questo, ma io sono solo intenzione di andare avanti 339 00:30:04,890 --> 00:30:07,550 "E fare tutto ciò che posso." 340 00:30:07,550 --> 00:30:11,500 Probabilmente tradurre questo in una stringa, 341 00:30:11,500 --> 00:30:15,000 ma è possibile che a un certo punto nel passato qualcuno ha detto 342 00:30:15,000 --> 00:30:20,180 definire b per essere 'CIAO MONDO'. 343 00:30:20,180 --> 00:30:28,740 Così ora b potrebbe essere una matrice costante e $ [b] saranno effettivamente fare 'CIAO MONDO'. 344 00:30:28,740 --> 00:30:32,380 Credo che a questo punto, o almeno le nostre impostazioni PHP, 345 00:30:32,380 --> 00:30:37,870 se si tenta di indice in un array e la chiave non esiste, si ottiene un errore. 346 00:30:37,870 --> 00:30:40,150 Non credo che sarà solo un avviso. 347 00:30:40,150 --> 00:30:44,560 O almeno è possibile impostarlo in modo che non si limita a mettere in guardia, solo che non riesce a dritto. 348 00:30:44,560 --> 00:30:49,290 >> Il modo in cui si controlla per vedere se vi è in realtà tale indice è isset. 349 00:30:49,290 --> 00:30:54,690 Così isset ($ array ['CIAO MONDO']) restituisce false. 350 00:30:54,690 --> 00:30:59,160 isset ($ array ['b']) restituisce true. 351 00:31:06,830 --> 00:31:09,880 È possibile combinare queste sintassi. 352 00:31:15,060 --> 00:31:22,440 Sono abbastanza sicuro di quello che questo array finirebbe per essere è - Siamo in grado di provarlo. 353 00:31:43,290 --> 00:31:45,700 Oh, ho bisogno di PHPWord. 354 00:31:53,960 --> 00:32:00,260 Questa è la sintassi di miscelazione in cui si specifica ciò che la chiave è 355 00:32:00,260 --> 00:32:03,330 e non si specifica ciò che la chiave è. 356 00:32:03,330 --> 00:32:05,520 SO 3 qui è un valore. 357 00:32:05,520 --> 00:32:08,080 Lei ha detto quello che non è esplicitamente la chiave sta per essere. 358 00:32:08,080 --> 00:32:11,670 Cosa ne pensa la chiave sarà? 359 00:32:11,670 --> 00:32:21,410 [Studente] 0. >> Sto indovinando 0 solo perché è il primo che non è stato specificato. 360 00:32:21,410 --> 00:32:23,500 Si può effettivamente fare un paio di questi casi. 361 00:32:23,500 --> 00:32:28,030 Così è stampare print_r ricorsiva. Verrà stampata l'intero array. 362 00:32:28,030 --> 00:32:32,700 Sarebbe stampare sottoarray della matrice se ci fossero. 363 00:32:32,700 --> 00:32:36,630 Così print_r ($ array); php.test.php. 364 00:32:36,630 --> 00:32:38,810 Lo fa sembrare che ha dato 0. 365 00:32:38,810 --> 00:32:43,530 In realtà c'è qualcosa da tenere a mente qui, ma torneremo ad esso in un secondo. 366 00:32:43,530 --> 00:32:45,850 Ma cosa succede se mi capita di fare questo indice 1? 367 00:32:45,850 --> 00:32:51,170 PHP non fa differenza tra gli indici delle stringhe e indici interi, 368 00:32:51,170 --> 00:33:00,280 quindi a questo punto che ho appena definito un indice 1 e non posso fare entrambe le cose $ array [1] e $ array ['1 '] 369 00:33:00,280 --> 00:33:06,250 e sarà lo stesso indice e la stessa chiave. 370 00:33:06,250 --> 00:33:13,000 Così ora che cosa ne pensi 3 sta per essere? >> [Studente] 2. >> [Bowden] sto cercando di indovinare 2. 371 00:33:16,000 --> 00:33:18,690 Gia '. E '2. 372 00:33:18,690 --> 00:33:24,790 E se abbiamo fatto questo è 10, questo è un 4? Cosa ne pensa l'indice di 3 sta per essere? 373 00:33:27,360 --> 00:33:29,110 Sto pensando 11. 374 00:33:29,110 --> 00:33:33,060 La mia ipotesi su ciò che PHP fa - e credo di aver visto prima - 375 00:33:33,060 --> 00:33:39,760 si tiene solo traccia di ciò che il più alto indice numerico che viene utilizzato finora è. 376 00:33:39,760 --> 00:33:44,230 Non è mai intenzione di assegnare un indice di stringa 3. Sarà sempre un indice numerico. 377 00:33:44,230 --> 00:33:47,690 Quindi registra il più alto è assegnato fino ad ora, che risulta essere 10, 378 00:33:47,690 --> 00:33:52,540 e sta andando a dare 11-3. 379 00:33:52,540 --> 00:34:02,110 Quello che ho detto prima, notare il modo in cui si sta stampando questa matrice. 380 00:34:02,110 --> 00:34:06,850 Esso stampa Rif. 10, il tasto 4, chiave 11, chiave d. 381 00:34:06,850 --> 00:34:09,790 O anche facciamo - 382 00:34:15,760 --> 00:34:22,489 Credo che non ho messo a 0, ma è la stampa 1, 2, 3, 4. 383 00:34:22,489 --> 00:34:29,330 Che cosa succede se passa qui? Oppure facciamo effettivamente passare questi 2. 384 00:34:29,330 --> 00:34:31,940 Ora la stampa 2, 1, 3, 4. 385 00:34:31,940 --> 00:34:41,270 PHP gli array non sono proprio come il vostro tavolo normale hash. 386 00:34:41,270 --> 00:34:45,570 E 'perfettamente ragionevole pensare a loro come tabelle hash 99% del tempo. 387 00:34:45,570 --> 00:34:53,790 Ma nelle tabelle hash non ha senso dell 'ordine in cui sono state inserite le cose. 388 00:34:53,790 --> 00:34:56,639 Quindi, non appena lo si inserisce nella tabella hash, 389 00:34:56,639 --> 00:35:00,590 assumono non c'è lista collegata e si potrebbe giudicare in una lista concatenata 390 00:35:00,590 --> 00:35:03,980 che è stato inserito per primo. 391 00:35:03,980 --> 00:35:10,060 Ma qui abbiamo inserito 2, primo e sa quando è la stampa di questa matrice che 2 viene prima. 392 00:35:10,060 --> 00:35:13,090 Non lo stampare in un qualsiasi ordine. 393 00:35:13,090 --> 00:35:17,550 La struttura di dati tecnici che si sta usando è una mappa ordinata, 394 00:35:17,550 --> 00:35:24,690 in modo che associa chiavi a valori e ricorda l'ordine in cui sono state inserite quelle chiavi. 395 00:35:24,690 --> 00:35:31,600 Fondamentalmente si tratta di alcune complicazioni dove è fastidioso in realtà - 396 00:35:31,600 --> 00:35:34,510 Diciamo che ha una matrice 0, 1, 2, 3, 4, 5 397 00:35:34,510 --> 00:35:37,700 e si desidera estrarre indice 2. 398 00:35:37,700 --> 00:35:47,750 Un modo di farlo, vediamo cosa simile. 399 00:35:47,750 --> 00:35:50,410 0, 2, 1, 3, 4. 400 00:35:50,410 --> 00:35:54,880 Unset succede a disinserire entrambe le variabili e gli indici degli array. 401 00:35:54,880 --> 00:35:58,630 Così unset ($ array [2]); 402 00:35:58,630 --> 00:36:03,430 Ora, che cosa è questo andare a guardare come? 2 è appena andato, quindi è perfettamente bene. 403 00:36:03,430 --> 00:36:11,670 Più fastidioso è che se si vuole che le cose siano in realtà come un array. 404 00:36:11,670 --> 00:36:14,910 Metterò numeri casuali. 405 00:36:14,910 --> 00:36:20,400 Ora notate i miei indici. 406 00:36:20,400 --> 00:36:26,860 Io voglio che sia proprio come un array C dove va da 0 a lunghezza - 1 407 00:36:26,860 --> 00:36:30,810 e posso scorrere su di esso in quanto tale. 408 00:36:30,810 --> 00:36:38,520 Ma non appena ho disinserito il secondo indice, ciò che era in indice 3 non ora diventato indice 2. 409 00:36:38,520 --> 00:36:44,790 Invece rimuove solo che indice e ora si va 0, 1, 3, 4. 410 00:36:44,790 --> 00:36:48,740 Questo è perfettamente ragionevole. 411 00:36:48,740 --> 00:36:53,950 E 'solo fastidioso e bisogna fare le cose come giunzione array. Gia '. 412 00:36:53,950 --> 00:36:57,200 >> [Studente] Che cosa accadrebbe se si ha un ciclo for 413 00:36:57,200 --> 00:36:59,630 e si voleva andare su tutti gli elementi? 414 00:36:59,630 --> 00:37:02,290 Quando ha colpito 2, sarebbe cedere mai? 415 00:37:02,290 --> 00:37:10,150 L'iterazione di un array. Ci sono 2 modi per farlo. 416 00:37:10,150 --> 00:37:12,770 È possibile utilizzare un normale ciclo for. 417 00:37:12,770 --> 00:37:22,000 Questo è un altro complessità di PHP. 418 00:37:22,000 --> 00:37:27,420 La maggior parte delle lingue, direi, avere una sorta di lunghezza o len o qualcosa del genere 419 00:37:27,420 --> 00:37:30,470 indica la lunghezza di un array. 420 00:37:30,470 --> 00:37:32,820 In PHP è conteggio. 421 00:37:32,820 --> 00:37:36,160 Quindi count ($ array); $ i + +) 422 00:37:36,160 --> 00:37:42,950 Diciamo solo print ($ array [$ i]); 423 00:37:45,920 --> 00:37:48,820 Notice: Undefined offset: 2. 424 00:37:48,820 --> 00:37:51,610 E 'solo andando a fallire. 425 00:37:51,610 --> 00:38:03,020 Questa è la ragione che, per la maggior parte, non è necessario scorrere un array come questo. 426 00:38:03,020 --> 00:38:07,110 Potrebbe essere un'esagerazione, ma non hai mai bisogno di iterare su un array come questo 427 00:38:07,110 --> 00:38:19,410 perché PHP fornisce la sua sintassi foreach dove foreach ($ array come $ item). 428 00:38:19,410 --> 00:38:31,830 Ora, se il risultato della stampa ($ item); - we'll discuterne in un secondo - che funziona perfettamente bene. 429 00:38:31,830 --> 00:38:38,960 Il modo in cui foreach sta lavorando è il primo argomento è l'array che si sta iterando. 430 00:38:38,960 --> 00:38:44,060 E il secondo argomento, oggetto, attraverso ogni passaggio del ciclo for 431 00:38:44,060 --> 00:38:52,690 sta andando a prendere la prossima cosa nella matrice. Quindi ricorda l'array ha un ordine. 432 00:38:52,690 --> 00:38:55,690 La prima volta attraverso il ciclo for, articolo sta per essere 123 433 00:38:55,690 --> 00:38:59,540 allora sarà 12 allora sarà 13 allora sarà 23 allora sarà 213. 434 00:38:59,540 --> 00:39:04,670 Le cose si fanno davvero strano quando si fa qualcosa di simile foreach. 435 00:39:04,670 --> 00:39:07,480 Vediamo cosa succede, perché non si dovrebbe mai fare questo. 436 00:39:07,480 --> 00:39:13,320 E se unset ($ array [1]); 437 00:39:20,410 --> 00:39:26,030 Questo è stato probabilmente previsto. 438 00:39:26,030 --> 00:39:30,950 Stai iterazione di questa matrice, e ogni volta che stai disinserimento del primo indice. 439 00:39:30,950 --> 00:39:39,720 Quindi, per l'indice 0, la prima cosa, elemento assume valore 0, in modo che sarà 123. 440 00:39:39,720 --> 00:39:44,630 Ma all'interno del ciclo for che unset indice 1, in modo che significa 12 è andato. 441 00:39:44,630 --> 00:39:57,480 Così la stampa. PHP_EOL. 442 00:39:57,480 --> 00:40:03,580 PHP_EOL è solo capo, ma è tecnicamente più portabile 443 00:40:03,580 --> 00:40:08,890 poiché a capo di Windows è diversa da newline su Mac e UNIX. 444 00:40:08,890 --> 00:40:18,040 In Windows 'a capo' \ r \ n, mentre tutto il resto tende solo per essere \ n. 445 00:40:18,040 --> 00:40:25,150 PHP_EOL è configurato in modo che utilizzi qualunque sia il ritorno a capo del sistema è. 446 00:40:25,150 --> 00:40:29,310 Quindi, stampare il. Cerchiamo di non print_r ($ array) alla fine. 447 00:40:32,830 --> 00:40:37,390 Non avevo idea che sarebbe il comportamento. 448 00:40:41,740 --> 00:40:48,960 Articolo assume ancora il valore 12 anche se abbiamo unset 12 prima abbiamo mai avuto modo dalla matrice. 449 00:40:52,770 --> 00:40:58,840 Non prendere la mia parola su questo, ma sembra che foreach crea una copia della matrice 450 00:40:58,840 --> 00:41:02,160 e poi voce assume tutti i valori di quella copia. 451 00:41:02,160 --> 00:41:07,760 Quindi, anche se si modifica l'array all'interno del ciclo for, 452 00:41:07,760 --> 00:41:17,240 non si cura. Articolo assumerà i valori originali. 453 00:41:17,240 --> 00:41:19,240 Proviamo di annullarla. 454 00:41:19,240 --> 00:41:24,460 E se questo è di $ array [1] = "ciao"; 455 00:41:24,460 --> 00:41:31,770 Anche se abbiamo messo "ciao" nella matrice, non è mai elemento assume tale valore. 456 00:41:31,770 --> 00:41:37,430 C'è un'altra sintassi per il foreach loop 457 00:41:37,430 --> 00:41:45,900 dove si mettono 2 variabili separate da una freccia. 458 00:41:45,900 --> 00:41:49,680 La prima variabile sta per essere la chiave di tale valore, 459 00:41:49,680 --> 00:41:53,050 e questa seconda variabile sta per essere la voce stessa esatta. 460 00:41:53,050 --> 00:42:01,610 Questo non è interessante qui, ma se torniamo al nostro caso originale di 'a' -> 1, 461 00:42:01,610 --> 00:42:06,090 'B' -> 1, 462 00:42:06,090 --> 00:42:14,470 qui se abbiamo appena iterazioni per ogni array come elemento, articolo sta per essere di 1 ogni volta. 463 00:42:14,470 --> 00:42:18,170 Ma se vogliamo anche sapere il tasto associato a tale elemento 464 00:42:18,170 --> 00:42:25,230 allora facciamo come $ chiave -> $ item. 465 00:42:25,230 --> 00:42:31,980 Così ora possiamo fare print ($ chiave. ':'. 466 00:42:31,980 --> 00:42:39,380 Ora è l'iterazione di stampa e di ogni tasto e il suo valore associato. 467 00:42:39,380 --> 00:42:47,030 >> Un'altra cosa che possiamo fare in loop foreach è che si potrebbe vedere questa sintassi. 468 00:42:47,030 --> 00:42:54,770 E commerciali prima di nomi di variabili tendono ad essere come il PHP fa riferimento. 469 00:42:54,770 --> 00:43:00,460 Se i riferimenti sono molto simili ai puntatori, 470 00:43:00,460 --> 00:43:04,820 non si dispone di puntatori, in modo da non fare con la memoria direttamente. 471 00:43:04,820 --> 00:43:12,620 Ma si ha riferimenti in cui 1 variabile si riferisce alla stessa cosa di un'altra variabile. 472 00:43:12,620 --> 00:43:21,450 All'interno di qui facciamo $ item. Torniamo a 1, 10. 473 00:43:21,450 --> 00:43:28,800 Facciamo $ item + +, che ancora esiste in PHP. Si può ancora fare + +. 474 00:43:28,800 --> 00:43:38,260 php.test.php. Devo stamparlo. print_r ($ array); 475 00:43:38,260 --> 00:43:42,730 Stampiamo 2, 11. 476 00:43:42,730 --> 00:43:49,560 Se avessi appena fatto foreach ($ array da $ articolo), allora voce sarà il valore 1 477 00:43:49,560 --> 00:43:54,190 la prima volta attraverso il ciclo. Esso aumenterà 1 a 2 e poi abbiamo finito. 478 00:43:54,190 --> 00:43:57,260 Allora si passerà attraverso il secondo passaggio del ciclo e che il punto è 10. 479 00:43:57,260 --> 00:44:01,570 Si incrementi voce a 11, e poi che è appena buttato via. 480 00:44:01,570 --> 00:44:06,670 Poi abbiamo print_r ($ array), e vediamo che questo è solo 1, 10. 481 00:44:06,670 --> 00:44:09,070 Quindi l'incremento che abbiamo fatto è stato perso. 482 00:44:09,070 --> 00:44:13,410 Ma foreach ($ array come & $ item) 483 00:44:13,410 --> 00:44:21,910 ora questa voce è la voce stessa di questa qui. E 'la stessa cosa. 484 00:44:21,910 --> 00:44:26,820 Quindi $ item + + sta modificando matrice 0. 485 00:44:29,330 --> 00:44:41,850 In sostanza, si può anche fare $ k -> array $ item e si può fare $ [$ k] + +; 486 00:44:41,850 --> 00:44:48,650 >> Quindi un altro modo di fare questo, siamo liberi di modificare voce, 487 00:44:48,650 --> 00:44:54,070 ma questo non modificare il nostro array originale. 488 00:44:54,070 --> 00:44:59,720 Ma se usiamo k, che è la nostra chiave, allora possiamo solo indice nel nostro array usando quella chiave 489 00:44:59,720 --> 00:45:01,530 e incrementare tale. 490 00:45:01,530 --> 00:45:05,410 Questo più direttamente modifica il nostro array originale. 491 00:45:05,410 --> 00:45:10,690 Si può anche fare che se per qualche motivo si voleva la possibilità di modificare - 492 00:45:10,690 --> 00:45:13,510 In realtà, questo è perfettamente ragionevole. 493 00:45:13,510 --> 00:45:16,020 Non hai voglia di scrivere $ array [$ k] + +, 494 00:45:16,020 --> 00:45:27,890 si voleva solo scrivere $ item + + ma è comunque volevo dire if ($ k === 'a') 495 00:45:27,890 --> 00:45:30,620 quindi incrementare elemento e quindi stampare il nostro array. 496 00:45:30,620 --> 00:45:36,290 Così ora che cosa ci aspettiamo print_r fare? Quali valori devono essere stampati? 497 00:45:36,290 --> 00:45:43,770 [Studente] 2 e 10. >> [Bowden] Solo se la chiave era 'a' facciamo in realtà la stampa che. 498 00:45:51,940 --> 00:45:55,670 >> Probabilmente molto raramente, se non mai, sarà necessario definire le funzioni in PHP, 499 00:45:55,670 --> 00:46:03,370 ma si potrebbe vedere qualcosa di simile in cui si definisce una funzione come qualsiasi funzione. 500 00:46:03,370 --> 00:46:09,900 Di solito si direbbe ($ pippo, $ bar) e quindi definire di essere qualsiasi cosa. 501 00:46:09,900 --> 00:46:17,580 Ma se faccio questo, allora ciò significa che tutto ciò che chiama tutto ciò, 502 00:46:17,580 --> 00:46:25,110 qualunque chiama baz, in modo che il primo argomento passato a baz possono essere cambiati. 503 00:46:25,110 --> 00:46:38,100 Facciamo $ pippo + +; 504 00:46:38,100 --> 00:46:48,020 e all'interno di qui facciamo Baz ($ item); 505 00:46:48,020 --> 00:46:52,250 Ora stiamo chiamando una funzione. 506 00:46:52,250 --> 00:46:56,780 L'argomento è preso per riferimento, il che significa che se lo modifica 507 00:46:56,780 --> 00:47:00,390 stiamo modificando la cosa che è stata approvata trovi 508 00:47:00,390 --> 00:47:04,420 E la stampa di questo ci aspettiamo che - a meno che non ho fatto un casino sintassi - abbiamo ottenuto 2, 11, 509 00:47:04,420 --> 00:47:06,300 quindi è stato effettivamente incrementato. 510 00:47:06,300 --> 00:47:08,790 Notare che abbiamo bisogno di riferimenti a 2 posti. 511 00:47:08,790 --> 00:47:13,050 Che cosa succede se ho fatto questo? Che cosa significa? 512 00:47:13,050 --> 00:47:15,810 [Studente] Cambierà. Sì >>. 513 00:47:15,810 --> 00:47:18,290 L'articolo è solo una copia del valore nella matrice. 514 00:47:18,290 --> 00:47:26,670 Così voce cambia a 2, ma l'array ['a'] sarà ancora 1. 515 00:47:26,670 --> 00:47:32,560 O che cosa se faccio questo? 516 00:47:32,560 --> 00:47:39,260 Ora elemento viene inviato in copia a baz. 517 00:47:39,260 --> 00:47:46,330 Quindi la copia della tesi sarà incrementato a 2, 518 00:47:46,330 --> 00:47:49,240 ma elemento stesso non è mai stato incrementato a 2. 519 00:47:49,240 --> 00:47:52,880 E voce è la stessa cosa di qualsiasi supporto di matrice, 520 00:47:52,880 --> 00:47:55,380 in modo tale matrice non è mai stato incrementato. 521 00:47:55,380 --> 00:47:57,960 Quindi entrambi questi luoghi ne hanno bisogno. 522 00:47:57,960 --> 00:48:03,830 >> PHP di solito è abbastanza intelligente per questo. 523 00:48:03,830 --> 00:48:06,570 Si potrebbe pensare che voglio passare per riferimento - 524 00:48:06,570 --> 00:48:09,560 Questo era in realtà una domanda su uno dei pset. 525 00:48:09,560 --> 00:48:14,480 Era una cosa questions.txt dove si dice, 526 00:48:14,480 --> 00:48:19,280 Perché potrebbe voler passare questa struttura per riferimento? 527 00:48:19,280 --> 00:48:21,250 Qual è stata la risposta a questo? 528 00:48:21,250 --> 00:48:25,100 [Studente] Quindi non c'è bisogno di copiare qualcosa di grande. Sì >>. 529 00:48:25,100 --> 00:48:32,920 Una struttura può essere arbitrariamente grande, e quando si passa la struttura come argomento 530 00:48:32,920 --> 00:48:36,800 ha bisogno di copiare il struct intera da passare alla funzione, 531 00:48:36,800 --> 00:48:40,410 che, se si passa il struct per riferimento 532 00:48:40,410 --> 00:48:46,530 quindi ha solo bisogno di copiare un indirizzo di 4 byte come argomento alla funzione. 533 00:48:48,520 --> 00:48:52,320 PHP è un po 'più intelligente di così. 534 00:48:52,320 --> 00:49:00,650 Se ho qualche funzione e passo ad un array di 1000 cose, 535 00:49:00,650 --> 00:49:03,990 vuol dire che sta andando ad avere per copiare tutti i 1.000 di quelle cose 536 00:49:03,990 --> 00:49:10,450 per passare alla funzione? Non deve farlo immediatamente. 537 00:49:10,450 --> 00:49:15,940 Se all'interno di questa funzione non ha mai fatto modifica foo, 538 00:49:15,940 --> 00:49:22,660 quindi se ($ pippo === 'ciao') return true.; 539 00:49:22,660 --> 00:49:26,460 Notare che abbiamo mai realmente modificato l'interno argomento di questa funzione, 540 00:49:26,460 --> 00:49:30,010 il che significa che tutto ciò che è stato passato come mai pippo deve essere copiato 541 00:49:30,010 --> 00:49:32,100 perché non è che la modifica. 542 00:49:32,100 --> 00:49:39,240 Quindi, il modo in cui funziona è PHP gli argomenti sono sempre passati per riferimento 543 00:49:39,240 --> 00:49:42,170 fino a che realmente provare a modificarla. 544 00:49:42,170 --> 00:49:51,160 Ora, se io dico $ pippo + +, ma ora fare una copia dell'originale foo e modificare la copia. 545 00:49:51,160 --> 00:49:53,090 Ciò consente di risparmiare tempo. 546 00:49:53,090 --> 00:49:58,210 Se non si è mai toccare questa matrice di massa, non è in realtà modificare, 547 00:49:58,210 --> 00:50:02,360 non è necessario per rendere la copia, 548 00:50:02,360 --> 00:50:06,640 mentre se abbiamo appena messo questo e commerciale che significa che non ha nemmeno copiarlo 549 00:50:06,640 --> 00:50:08,640 anche se non lo modifica. 550 00:50:08,640 --> 00:50:10,680 Questo comportamento è chiamato copy-on-write. 551 00:50:10,680 --> 00:50:17,380 Lo potete vedere in altri posti, soprattutto se si prende un corso di sistema operativo. 552 00:50:17,380 --> 00:50:23,880 Copy-on-write è un modello abbastanza normale in cui non c'è bisogno di fare una copia di qualcosa 553 00:50:23,880 --> 00:50:26,650 meno che non sia effettivamente cambiando. Gia '. 554 00:50:26,650 --> 00:50:29,520 [Studente] Che cosa succede se si ha avuto l'incremento all'interno del test, 555 00:50:29,520 --> 00:50:33,700 in modo che solo 1 elemento su 1000 dovrebbe essere cambiato? 556 00:50:33,700 --> 00:50:38,770 Non ne sono sicuro. 557 00:50:38,770 --> 00:50:51,250 Penso che sarebbe copiare l'intera cosa, ma è possibile che sia abbastanza intelligente che - 558 00:50:51,250 --> 00:51:00,020 In realtà, quello che sto pensando è immaginare abbiamo avuto una matrice che assomiglia a questo: $ array2 = [ 559 00:51:00,020 --> 00:51:11,000 Poi l'indice 'a' è un array di [1 2 3 4], e l'indice di 'b' è un array di qualsiasi altra cosa. 560 00:51:11,000 --> 00:51:15,380 Ho bisogno di virgole tra tutti quelli. Immagina che non ci sono le virgole. 561 00:51:15,380 --> 00:51:21,210 Then 'c' è il 3 Valore. 562 00:51:24,210 --> 00:51:26,290 Va bene. 563 00:51:26,290 --> 00:51:33,440 Ora diciamo che facciamo $ baz ($ array2); 564 00:51:33,440 --> 00:51:36,540 dove baz non prendere questo come riferimento. 565 00:51:43,510 --> 00:51:47,370 Quindi $ pippo ['c'] + +; 566 00:51:47,370 --> 00:51:52,340 Questo è un esempio in cui stiamo passando array2 come argomento 567 00:51:52,340 --> 00:51:57,010 e quindi si modifica un indice specifico della matrice per incrementarla. 568 00:51:57,010 --> 00:52:01,090 Onestamente non hanno idea di ciò che PHP sta per fare. 569 00:52:01,090 --> 00:52:07,200 Si può facilmente fare una copia di tutta la cosa, ma se è intelligente, 570 00:52:07,200 --> 00:52:15,030 farà una copia di questi tasti in cui questo avrà il suo valore distinto 571 00:52:15,030 --> 00:52:20,620 ma questo può ancora puntare allo stesso array 1,2,3,4 572 00:52:20,620 --> 00:52:22,320 e questo può ancora puntare allo stesso array. 573 00:52:22,320 --> 00:52:24,170 Torno iPad esso. 574 00:52:28,900 --> 00:52:45,950 Passiamo in questo array in cui questo ragazzo a 3 punti, esistono ragazzo di [1,2,3,4], 575 00:52:45,950 --> 00:52:51,350 questo ragazzo punta a [34, ...] 576 00:52:51,350 --> 00:52:58,590 Ora che stiamo passando a baz, stiamo modificando questo. 577 00:52:58,590 --> 00:53:03,550 Se PHP è intelligente, si può solo fare - 578 00:53:11,850 --> 00:53:18,230 Avevamo ancora la copia della memoria, ma se non ci fossero questi sottoarray enormi nidificate 579 00:53:18,230 --> 00:53:21,560 non abbiamo bisogno di copiare quelli. 580 00:53:21,560 --> 00:53:27,530 Non so se questo è ciò che fa, ma posso immaginare che farlo. 581 00:53:29,050 --> 00:53:36,690 Questo è anche un vantaggio abbastanza grande di C su PHP. 582 00:53:36,690 --> 00:53:40,320 >> PHP rende la vita molto più facile per un sacco di cose, 583 00:53:40,320 --> 00:53:45,060 ma tipo non hanno assolutamente idea di quanto bene si esibiranno 584 00:53:45,060 --> 00:53:52,530 perché non ho idea sotto la cappa quando è fare queste copie di cose, 585 00:53:52,530 --> 00:53:55,170 oh, è che sarà una copia costante di tempo, 586 00:53:55,170 --> 00:54:01,140 sta solo andando a cambiare 1 puntatore, sta andando essere una copia ridicolmente difficile lineare? 587 00:54:01,140 --> 00:54:03,000 E se non riesce a trovare spazio? 588 00:54:03,000 --> 00:54:06,760 Ha quindi bisogno di eseguire la garbage collection per avere ancora un po 'di spazio? 589 00:54:06,760 --> 00:54:11,210 E garbage collection può richiedere arbitrariamente lungo. 590 00:54:11,210 --> 00:54:13,600 In C non ci si deve preoccupare di queste cose. 591 00:54:13,600 --> 00:54:19,780 Ogni singola linea che si scrive può ragionare più o meno di come sta andando a svolgere. 592 00:54:26,800 --> 00:54:29,150 >> Guardiamo indietro a questi. 593 00:54:35,400 --> 00:54:37,520 Che bello è che non si ha a che fare con funzioni hash, 594 00:54:37,520 --> 00:54:39,010 liste collegate, o qualcosa di simile? 595 00:54:39,010 --> 00:54:41,980 Dal momento che lavora con le tabelle hash è così facile ora, ecco un divertente rompicapo su cui lavorare. 596 00:54:41,980 --> 00:54:45,920 Aprire un file chiamato unique.php e scrivi un programma PHP 597 00:54:45,920 --> 00:54:48,330 (Noto anche come "script"). 598 00:54:48,330 --> 00:54:55,700 Noi tendiamo a chiamarli script se sono cose brevi che si esegue dalla riga di comando. 599 00:54:55,700 --> 00:55:02,950 In sostanza, qualsiasi linguaggio che non si compila, ma si sta andando a eseguire il file eseguibile 600 00:55:02,950 --> 00:55:05,920 dalla riga di comando, è possibile chiamare lo script eseguibile. 601 00:55:05,920 --> 00:55:08,510 Potrei anche scrivere un programma in C che fa questo, 602 00:55:08,510 --> 00:55:12,300 ma io non chiamo uno script da quando ho prima compilare ed eseguire il file binario. 603 00:55:12,300 --> 00:55:15,480 Ma questo programma PHP che andremo a chiamare uno script. 604 00:55:15,480 --> 00:55:23,830 Oppure, se l'abbiamo scritto in Python o Perl o Node.js o una qualsiasi di queste cose, 605 00:55:23,830 --> 00:55:26,500 ci piacerebbe chiamarli tutti gli script, perché vengono eseguiti dalla riga di comando 606 00:55:26,500 --> 00:55:30,040 ma noi non li compila. 607 00:55:30,860 --> 00:55:33,400 Potremmo farlo abbastanza rapidamente. 608 00:55:36,960 --> 00:55:41,480 Non abbiamo intenzione di usare argv. Diciamo solo saltare attraverso questo. 609 00:55:41,480 --> 00:55:45,730 Chiamatela unico, scrivere un programma. 610 00:55:45,730 --> 00:55:49,400 Si può supporre che l'ingresso conterrà una parola per riga. 611 00:55:49,400 --> 00:55:52,020 In realtà, argv sarà abbastanza banale da usare. 612 00:56:03,730 --> 00:56:06,720 unique.php. 613 00:56:08,550 --> 00:56:13,750 Per prima cosa, vogliamo verificare se ci sono state tramandate 1 comando argomento della riga. 614 00:56:13,750 --> 00:56:20,900 Proprio come ci si aspetterebbe argc e argv in C, abbiamo ancora quelli in PHP. 615 00:56:20,900 --> 00:56:33,900 Quindi, se ($ argc == 2) allora non si occuperà di stampa di un messaggio o altro. 616 00:56:33,900 --> 00:56:37,340 Mi limiterò a uscire, il codice di errore di 1. 617 00:56:37,340 --> 00:56:41,340 Potrei anche tornare 1. 618 00:56:41,340 --> 00:56:53,180 Raramente in PHP si è in questo stato in cui siamo arrivati ​​- 619 00:56:53,180 --> 00:56:57,820 Di solito sei in una funzione chiamata da una funzione chiamata da una funzione chiamata da una funzione. 620 00:56:57,820 --> 00:57:02,070 E se qualcosa va storto e si desidera solo per uscire da tutto tutto, 621 00:57:02,070 --> 00:57:05,680 uscita termina proprio il programma. 622 00:57:05,680 --> 00:57:08,160 Questo esiste anche in C. 623 00:57:08,160 --> 00:57:10,700 Se siete in una funzione in una funzione in una funzione in una funzione 624 00:57:10,700 --> 00:57:17,540 e si vuole uccidere solo il programma, è possibile chiamare uscita e lo script termina. 625 00:57:17,540 --> 00:57:23,120 Ma in PHP è ancora più raro che ci sono a questo livello superiore. 626 00:57:23,120 --> 00:57:26,090 Di solito siamo dentro una specie di funzione, in modo che noi chiamiamo uscita 627 00:57:26,090 --> 00:57:29,650 in modo da non dover tornare a 1 cosa che realizza poi c'è un errore 628 00:57:29,650 --> 00:57:32,270 in modo che ritorna su se riconosce che c'è stato un errore. 629 00:57:32,270 --> 00:57:35,270 Non vogliamo far fronte a questa, in modo da uscire (1); 630 00:57:35,270 --> 00:57:38,240 ritorno (1), in questo caso sarebbe equivalente. 631 00:57:38,240 --> 00:57:44,000 >> Allora che cosa vogliamo aprire vogliamo fopen. 632 00:57:44,000 --> 00:57:46,760 Gli argomenti vanno a guardare piuttosto simili. 633 00:57:46,760 --> 00:57:51,600 Vogliamo fopen ($ argv [1], e vogliamo aprire per la lettura. 634 00:57:51,600 --> 00:57:55,720 Che restituisce una risorsa che andremo a chiamare f. 635 00:57:55,720 --> 00:58:02,180 Questo sembra piuttosto simile a come lo fa C tranne che non c'è bisogno di dire * FILE. 636 00:58:02,180 --> 00:58:06,170 Invece ci limitiamo a dire $ f. Va bene. 637 00:58:06,170 --> 00:58:17,190 A dire il vero, credo che questo ci dà anche un suggerimento per la funzione PHP chiamata file. PHP File. 638 00:58:17,190 --> 00:58:23,990 Ciò che questo sta andando a fare è leggere un intero file in un array. 639 00:58:23,990 --> 00:58:29,770 Non hai nemmeno bisogno di fopen esso. E 'intenzione di farlo per voi. 640 00:58:37,450 --> 00:58:43,700 Quindi $ righe = file ($ argv [1]); 641 00:58:43,700 --> 00:58:49,680 Ora tutte le righe del file sono in linee. Ora vogliamo ordinare le linee. 642 00:58:49,680 --> 00:58:52,180 Come ordinare le linee? 643 00:58:52,180 --> 00:58:54,920 Abbiamo ordinare le linee. 644 00:58:54,920 --> 00:58:58,080 E ora siamo in grado di stampare o qualsiasi altra cosa. 645 00:58:58,080 --> 00:59:05,580 Probabilmente il modo più semplice è foreach ($ righe da $ riga) echo $ riga; 646 00:59:05,580 --> 00:59:10,960 [Studente] Non sarebbe abbiamo anche attraversare le linee di riferimento a qualcosa in genere? 647 00:59:10,960 --> 00:59:28,850 E 'qui che tipo potrebbe essere definito come una sorta di funzione (& $ array). 648 00:59:28,850 --> 00:59:32,650 Quando si chiama la funzione di non passare per riferimento. 649 00:59:32,650 --> 00:59:36,900 E 'la funzione che lo definisce come prenderlo come riferimento. 650 00:59:36,900 --> 00:59:40,900 Questo in realtà è esattamente ciò che è andato storto 651 00:59:40,900 --> 00:59:46,220 quando abbiamo messo tutto ai nostri server quando siamo andati 5,3-5,4. 652 00:59:46,220 --> 00:59:53,800 Fino a 5.4, questo era perfettamente ragionevole. 653 00:59:53,800 --> 00:59:58,740 Una funzione non si aspetta di prendere come riferimento, ma è possibile passare come riferimento 654 00:59:58,740 --> 01:00:02,860 quindi se la funzione avviene per modificarlo, è ancora modificato. 655 01:00:02,860 --> 01:00:05,850 A partire da 5.4, non dovresti farlo. 656 01:00:05,850 --> 01:00:11,740 Così ora l'unico modo che si passa da riferimento è se la funzione lo fa esplicitamente. 657 01:00:11,740 --> 01:00:19,840 Se non si desidera che per modificarlo, allora avete bisogno di fare $ copia = $ righe e copia pass. 658 01:00:19,840 --> 01:00:24,820 Così ora le linee saranno conservati e la copia verrà modificato. 659 01:00:27,670 --> 01:00:31,460 php.unique.php. Potrei aver incasinato qualcosa. 660 01:00:31,460 --> 01:00:33,190 Unexpected 'sort'. 661 01:00:38,320 --> 01:00:43,850 Ci sarà qualcosa che lo fa per noi. 662 01:00:43,850 --> 01:00:45,820 Non è nemmeno lì. 663 01:00:45,820 --> 01:00:52,140 Avviso quando si legge il manuale che il primo argomento dovrebbe essere un array 664 01:00:52,140 --> 01:00:56,490 ed è preso come riferimento. 665 01:00:58,160 --> 01:01:03,540 Perché questo lamentarsi con me? Perché ho questo genere funzione ancora qui che io non voglio. 666 01:01:03,540 --> 01:01:09,210 Ok, php.unique.php. Non l'ho fatto passare un argomento perché non si dispone di un file. 667 01:01:09,210 --> 01:01:13,560 E 'php.unique.php su test.php. 668 01:01:13,560 --> 01:01:19,080 Ecco test.php tutti stampati in un ordine bello ordinato. 669 01:01:19,080 --> 01:01:24,600 Si noti che modo ordinato è un po 'strano per un file di codice 670 01:01:24,600 --> 01:01:27,460 perché tutte le nostre righe vuote stanno per venire prima 671 01:01:27,460 --> 01:01:30,190 poi stanno per venire tutti i nostri 1 tacche di livello 672 01:01:30,190 --> 01:01:33,360 poi vengono tutti i nostri rientranze n. 673 01:01:33,360 --> 01:01:38,620 Gia '. >> [Studente] Così, per il codice sorgente non è stato passato per riferimento? 674 01:01:38,620 --> 01:01:42,240 È che in genere passati per valore? 675 01:01:42,240 --> 01:01:50,240 [Bowden] Quando si chiama una funzione, non determina se è stato passato per riferimento. 676 01:01:50,240 --> 01:01:53,960 E 'la definizione della funzione che determina se è stato passato per riferimento. 677 01:01:53,960 --> 01:01:59,450 E guardando la definizione della funzione di ordinamento o semplicemente in cerca di questo, 678 01:01:59,450 --> 01:02:02,820 ci vuole un argomento per riferimento. 679 01:02:02,820 --> 01:02:07,160 Quindi, indipendentemente dal fatto che si desidera prendere per riferimento, lo fa prendere per riferimento. 680 01:02:07,160 --> 01:02:10,200 Esso modifica l'array in posizione. 681 01:02:10,200 --> 01:02:17,400 Questo non è solo consentito. Lei non è autorizzato a farlo. >> [Studente] Oh, va bene. 682 01:02:17,400 --> 01:02:22,410 [Bowden] Questo, specie sta andando a prendere le linee di riferimento e modificarlo. 683 01:02:22,410 --> 01:02:26,850 E ancora, se non vuoi fare questo, si può fare una copia di sorta. 684 01:02:26,850 --> 01:02:35,850 Anche in questo caso, copia non è una copia di linee. 685 01:02:35,850 --> 01:02:40,620 Essa ricorda solo per la stessa cosa fino a quando non prima viene modificato, 686 01:02:40,620 --> 01:02:44,430 dove il primo sta per arrivare modificato nella funzione di ordinamento, 687 01:02:44,430 --> 01:02:50,940 dove, perché è copy-on-write, ora una copia dell'esemplare sta per essere fatta. 688 01:02:57,500 --> 01:03:04,250 È anche possibile fare questo. Questo è l'altro posto è possibile vedere e commerciale. 689 01:03:04,250 --> 01:03:07,190 Lo vedi in loop foreach, si vede nelle dichiarazioni di funzione, 690 01:03:07,190 --> 01:03:10,040 e lo si vede quando solo l'assegnazione delle variabili. 691 01:03:10,040 --> 01:03:12,350 Ora abbiamo realizzato nulla in questo modo 692 01:03:12,350 --> 01:03:15,600 perché copia e le linee sono letteralmente la stessa cosa. 693 01:03:15,600 --> 01:03:19,940 È possibile utilizzare le linee e copiare in modo intercambiabile. 694 01:03:19,940 --> 01:03:25,430 Si può fare unset ($ copia), e che non le linee unset, 695 01:03:25,430 --> 01:03:29,120 basta perdere il riferimento alla stessa cosa. 696 01:03:29,120 --> 01:03:33,440 Quindi, a partire da questo punto, ora le linee è l'unico modo per accedere alle linee. 697 01:03:36,450 --> 01:03:38,770 >> Domande? 698 01:03:41,000 --> 01:03:42,460 Gia '. 699 01:03:42,460 --> 01:03:45,880 [Studente] Completamente fuori tema, ma non c'è bisogno di chiudere PHP con l'opzione - >> Non lo sai. 700 01:03:45,880 --> 01:03:47,730 Va bene. 701 01:03:47,730 --> 01:03:53,790 [Bowden] vorrei andare fino a dire che è cattiva pratica di chiuderle. 702 01:03:53,790 --> 01:03:57,580 Questo è probabilmente una esagerazione, soprattutto in uno script, 703 01:03:57,580 --> 01:04:03,740 ma vediamo cosa succede se faccio questo. 704 01:04:03,740 --> 01:04:08,890 Che non ha fatto nulla. E se io volessi - [sospira] 705 01:04:13,870 --> 01:04:16,960 Ho bisogno di passare un argomento. 706 01:04:19,000 --> 01:04:22,050 Spara. Ho chiamato sbagliato. 707 01:04:24,340 --> 01:04:28,310 Così php.unique.php con un argomento. 708 01:04:28,310 --> 01:04:30,980 Ora non ho nemmeno bisogno di questo. 709 01:04:34,520 --> 01:04:37,740 Io lo passare un argomento valido. 710 01:04:37,740 --> 01:04:42,050 Questo stampato qualunque cosa è la stampa. 711 01:04:45,260 --> 01:04:50,080 Sto stampa copia e la copia non esiste. Così le linee. 712 01:04:53,650 --> 01:04:58,270 E 'stampato tutto, e quindi osservare tutta questa spazzatura qui, 713 01:04:58,270 --> 01:05:06,690 perché in nulla PHP che è al di fuori dei tag PHP 714 01:05:06,690 --> 01:05:09,520 è solo andare da stampare letteralmente. 715 01:05:09,520 --> 01:05:18,050 Questo è il motivo per cui HTML, è così bello che io possa fare div bla, bla, bla classe o qualsiasi altra cosa, 716 01:05:18,050 --> 01:05:25,140 bla, bla, bla e poi fare un po 'di codice PHP e poi fare div fine. 717 01:05:25,140 --> 01:05:36,460 E ora la stampa di questo ho la mia bella div in alto, tutto ciò che PHP stampato, div in fondo. 718 01:05:36,460 --> 01:05:43,510 Disastroso quando qualcosa del genere accade, che è abbastanza comune, 719 01:05:43,510 --> 01:05:47,930 solo un ritorno a capo randagio nella parte inferiore del file. 720 01:05:47,930 --> 01:05:50,940 Non si potrebbe pensare che sarebbe stato un grosso affare 721 01:05:50,940 --> 01:05:58,660 se non si considera il fatto che con i browser - 722 01:05:58,660 --> 01:06:03,880 >> Come reindirizza lavoro o in pratica qualsiasi lavoro intestazioni, 723 01:06:03,880 --> 01:06:07,980 quando si effettua la connessione a un sito web e rimanda tutte queste intestazioni e cose 724 01:06:07,980 --> 01:06:12,020 come risposta 200 o risposta reindirizzare o qualsiasi altra cosa, 725 01:06:12,020 --> 01:06:18,230 intestazioni sono validi solo fino al primo byte di dati viene inviato. 726 01:06:18,230 --> 01:06:23,140 È possibile reindirizzare migliaia di volte, ma appena il primo byte di dati viene inviato 727 01:06:23,140 --> 01:06:26,120 non dovresti reindirizzare di nuovo. 728 01:06:26,120 --> 01:06:31,860 >> Se si dispone di un ritorno a capo randagio alla fine di un file 729 01:06:31,860 --> 01:06:37,260 e diciamo che si utilizza questa funzione e quindi si desidera - 730 01:06:41,580 --> 01:06:52,870 Diciamo che è un altro file che è index.php e require_once qualcosa - 731 01:06:52,870 --> 01:06:56,920 Non riesco a pensare ad un buon esempio di esso. 732 01:06:56,920 --> 01:07:04,740 Il problema si verifica quando questa riga in basso viene eco. 733 01:07:04,740 --> 01:07:08,660 Non voglio niente di essere stato ancora eco. 734 01:07:10,820 --> 01:07:15,700 Anche se non avete intenzione di ottenere qualcosa di eco, qualcosa è ottenere eco 735 01:07:15,700 --> 01:07:17,990 e così ora non dovresti inviare intestazioni più 736 01:07:17,990 --> 01:07:20,030 e si sta andando ad ottenere denunce. 737 01:07:22,170 --> 01:07:24,420 È solo che non bisogno di quei tag di chiusura. 738 01:07:24,420 --> 01:07:27,420 Se hai intenzione di fare qualcosa con HTML - 739 01:07:27,420 --> 01:07:30,490 ed è perfettamente ragionevole fare qui div qualunque 740 01:07:30,490 --> 01:07:39,450 e poi a questo punto si può o non si riesce a comprendere. 741 01:07:39,450 --> 01:07:41,590 Non ha molta importanza. 742 01:07:41,590 --> 01:07:45,450 Ma negli script PHP è raro per chiuderla. 743 01:07:45,450 --> 01:07:50,400 Quando tutto è PHP, ma proprio tutto, 744 01:07:50,400 --> 01:07:55,460 non si ha realmente bisogno per chiuderla / non si deve chiudere. 745 01:08:02,030 --> 01:08:05,720 >> Trattare con le stringhe è molto più bello in C. 746 01:08:05,720 --> 01:08:09,470 In PHP è possibile specificare una stringa con virgolette singole o doppie. 747 01:08:09,470 --> 01:08:12,820 Con apici non è possibile utilizzare le sequenze di "escape". 748 01:08:12,820 --> 01:08:17,640 Costantemente scappare, bla, bla, bla. 749 01:08:19,920 --> 01:08:24,010 Così printf è molto raro in PHP. 750 01:08:24,010 --> 01:08:32,290 Credo che avrei usato printf se volevo fare una cosa del genere - in pset 5 E 'utilizzato sprintf o qualsiasi altra cosa. 751 01:08:32,290 --> 01:08:36,060 Ma che vuoi fare e 001.jpg 002.jpg. 752 01:08:36,060 --> 01:08:40,300 Quindi, per questo genere di cose in cui ho effettivamente desidera formattare il testo vorrei usare printf. 753 01:08:40,300 --> 01:08:44,689 Ma per il resto vorrei solo usare la concatenazione di stringhe. 754 01:08:44,689 --> 01:08:47,000 Non ho mai davvero usare printf. 755 01:08:49,229 --> 01:09:00,170 Stiamo solo differenziando i dettagli tra apici singoli e doppi. 756 01:09:00,170 --> 01:09:07,490 La differenza più grande è che le virgolette singole, verrà stampato letteralmente. 757 01:09:07,490 --> 01:09:15,390 Non vi è alcun tipo di dati char in PHP, a differenza di C, quindi questo è equivalente a questa. 758 01:09:15,390 --> 01:09:17,970 Sono entrambe le stringhe. 759 01:09:17,970 --> 01:09:29,180 E la cosa bella di stringhe virgolette singole è che potrei dire 'Ciao mondo!' bla, bla, bla, 760 01:09:29,180 --> 01:09:33,340 $ $ Wooo. 761 01:09:33,340 --> 01:09:38,260 Che cosa succede quando si stampa questo è che lo stampa letteralmente. 762 01:09:38,260 --> 01:09:40,680 Liberiamoci di tutte le nostre cose. 763 01:09:40,680 --> 01:09:44,700 Così echo $ str1; 764 01:09:48,569 --> 01:09:56,570 E 'letteralmente stampata tutte queste cose: segni di dollaro, 765 01:09:56,570 --> 01:09:58,770 backslash n, che si potrebbe pensare che sarebbe a capo - 766 01:09:58,770 --> 01:10:01,500 tutte queste cose la stampa alla lettera. 767 01:10:01,500 --> 01:10:05,650 L'unica cosa che hai bisogno di fuggire sono i singoli apici 768 01:10:05,650 --> 01:10:09,470 perché altrimenti potrebbe pensare che sta chiudendo le virgolette singole. 769 01:10:09,470 --> 01:10:15,050 Le virgolette doppie, completamente diverse. 770 01:10:20,300 --> 01:10:25,870 Abbiamo già vedere l'evidenziazione della sintassi ci cluing a ciò che sta per andare storto. 771 01:10:25,870 --> 01:10:36,190 php.unique. Variabile non definita: wooo perché questo viene interpretato come una variabile chiamata wooo. 772 01:10:36,190 --> 01:10:42,400 Le virgolette doppie consentono di inserire le variabili in - 773 01:10:42,400 --> 01:10:52,730 Diciamo $ name = "Rob"; 774 01:10:52,730 --> 01:10:58,020 Così echo "Ciao, il mio nome è $ nome!"; 775 01:10:58,020 --> 01:11:09,260 Riconosce questa come variabile. 776 01:11:09,260 --> 01:11:21,210 Quando corro che - e mi inserisce un ritorno a capo - Ciao, il mio nome è Rob! e ciao a tutti! 777 01:11:21,210 --> 01:11:24,910 Questo perché non ho mai tolto la stampa di wooo sopra. 778 01:11:24,910 --> 01:11:30,020 C'è 1 ulteriore passo avanti si può fare. 779 01:11:30,020 --> 01:11:39,250 $ Array = [1, 2, 3]; 780 01:11:39,250 --> 01:11:43,270 Che cosa devo fare per stampare il primo indice dell'array? 781 01:11:43,270 --> 01:11:45,150 Tu fai $ array [0]. 782 01:11:45,150 --> 01:11:49,280 L'evidenziazione della sintassi è un indizio. Che cosa è questa intenzione di fare? 783 01:11:52,320 --> 01:11:54,510 php.unique. 784 01:11:54,510 --> 01:11:59,860 Ciao, il mio nome è 1! che non è quello che volevo. 785 01:11:59,860 --> 01:12:05,050 Evidenziazione della sintassi mi ha mentito. 786 01:12:05,050 --> 01:12:13,020 Proviamo 'a' -> 1, 'b' -> 2. 787 01:12:18,450 --> 01:12:21,440 È così che avrei dovuto scriverlo. 788 01:12:26,350 --> 01:12:32,160 Unexpected virgoletta singola (T_ENCAPSED bla, bla, bla, bla, bla). 789 01:12:32,160 --> 01:12:41,780 L'idea è che non è riconoscere questo come parte della matrice. 790 01:12:41,780 --> 01:12:46,620 Non è riconoscere questo come array indicizzato da una lettera. 791 01:12:46,620 --> 01:12:49,870 Vuoi farlo circondata da parentesi graffe, 792 01:12:49,870 --> 01:12:54,730 e ora tutto ciò che è in questa parentesi graffa viene interpolata, 793 01:12:54,730 --> 01:13:00,340 che è la parola che usiamo per l'inserimento di queste variabili magicamente nei posti giusti. 794 01:13:00,340 --> 01:13:04,280 Ora fare questo, php.unique, e Ciao, il mio nome è 1! come previsto 795 01:13:04,280 --> 01:13:07,720 o Ciao, il mio nome è Rob! 796 01:13:14,110 --> 01:13:23,130 Una cosa che una specie di bello di singoli apici è che - 797 01:13:23,130 --> 01:13:28,480 Ci sono un certo costo per l'interpolazione. 798 01:13:30,520 --> 01:13:35,100 Se si utilizzano le virgolette doppie, l'interprete deve andare oltre questa stringa, 799 01:13:35,100 --> 01:13:41,500 fare in modo che, "Oh, ecco una variabile. Ora ho bisogno di andare a prendere quella variabile e inserirla qui." 800 01:13:41,500 --> 01:13:48,930 Anche se non si utilizzano le variabili, 801 01:13:48,930 --> 01:13:52,220 non all'interno di queste virgolette deve essere interpolato, 802 01:13:52,220 --> 01:13:56,800 ma sarà ancora più lento, perché ha bisogno di andare oltre le doppie virgolette 803 01:13:56,800 --> 01:14:00,130 alla ricerca di cose che devono essere interpolati. 804 01:14:00,130 --> 01:14:05,360 Così virgolette singole può essere un po 'più veloce se non ha bisogno di essere interpolati, 805 01:14:05,360 --> 01:14:15,650 e tendo a usare anche le virgolette singole per, 'Ciao, il mio nome è'. $ Array ['a'] comunque. 806 01:14:15,650 --> 01:14:20,430 Che sta per essere equivalente a quello che avevamo prima. 807 01:14:24,840 --> 01:14:28,440 Ma è una questione di preferenze. 808 01:14:28,440 --> 01:14:34,750 Se si sta utilizzando PHP, probabilmente non si preoccupano la differenza di velocità. 809 01:14:34,750 --> 01:14:39,480 Non c'è abbastanza ragionare fuori per cominciare. 810 01:14:39,480 --> 01:14:43,030 >> Tutte le domande finali? 811 01:14:47,430 --> 01:14:51,710 >> In realtà non ha nemmeno a superare tutto questo, ma questa roba era noioso. 812 01:14:51,710 --> 01:14:59,080 L'ultima cosa che una specie di piacevole in PHP è quando hai a che fare con l'HTML, 813 01:14:59,080 --> 01:15:06,450 che servirà un po ', in modo che la sintassi bella scorciatoia per la stampa di una variabile. 814 01:15:32,400 --> 01:15:36,730 Senza mettere PHP qui, si parla di tag brevi. 815 01:15:36,730 --> 01:15:44,330 Ufficialmente da PHP 5.4, questo è deprecato. 816 01:15:44,330 --> 01:15:48,640 Si consiglia di mettere php. 817 01:15:48,640 --> 01:15:55,770 Questo è ancora supportato, i tag in modo da brevi con la 01:16:02,480 E 'supportato per impostazione predefinita, in modo da poter utilizzare questi come si desidera, e sono abbastanza conveniente. 819 01:16:02,480 --> 01:16:05,700 >> Hai ancora domande? 820 01:16:07,780 --> 01:16:09,270 Bene. 821 01:16:10,840 --> 01:16:13,800 >> Soggiorno di classe, San Diego. 822 01:16:13,800 --> 01:16:16,070 [Ridacchia] 823 01:16:18,620 --> 01:16:22,660 Bye. [Ride] 824 01:16:24,350 --> 01:16:28,470 [Applausi] [ride] 825 01:22:46,460 --> 01:22:49,460 >> [CS50.TV]