>> Per cominciare a colmare quello potrebbe essere la tua unica esperienza
con la programmazione web, quello che ho ho pensato di fare è rubare un paio
di esempi che si può essere visto in 50
se hai preso il passato anno o due o non possono avere
se hai preso un paio di anni fa,
che sono piccoli passi verso la un piridina conosciuto come MBC,
Model View Controller, e cosa significa questo?
Questo è vedremo di nuovo, forse è solo un modo di partenza
per ripulire la progettazione di alcuni web-based pezzo di software,
o potrebbe essere lato client basati pure, ma lo useremo
nel contesto di PHP, in modo che possiamo cominciare
rendere più complessa progetti e liste
di diversi tipi separati di codice all'interno dell'applicazione;
particolare in modo che quando avere più persone che lavorano
su un progetto è molto più facile da disegnare linee.
Quindi, prima diamo uno guardare un modo subottimale
di attuare qualcosa.
Supponiamo che io volevo fare un super semplice sito web corso per 50
o di qualsiasi altra classe, e che la classe ha le cose
come conferenze e un programma di studio.
Potrei fare qualcosa di simile a un tag h1 in cima alla mia pagina
e una lista non ordinata con Lista li elementi in ordine
avere solo un elenco puntato di opzioni di menu, in modo super semplice.
Così come potremmo farlo?
Beh, lasciatemi andare nella mia finestra di terminale qui,
e notare che ho una lettura me e ci colleghiamo a questo codice
sul sito web del corso in un po ',
e accorgo che ho Indice dot htm - Indice dot php.
Allora lasciami andare avanti e aprire che, e abbastanza sicuro che sia gentile
di sciocco che questo anche chiamato php
perché tutto quello che ho è un commento php
e poi tutto il resto è solo codice html grezzo.
Ma ancora una volta questa è la versione zero,
quindi un passo verso qualcosa di più interessante,
ma ho notato hard coded CS50 come titolo, CS50 nella h1,
e ora ho l' lezioni collegamento,
ora ho il link programma.
Va bene, in modo che non Sembra tutto quello irragionevole
fino a quando si segue un link come lezioni, e ti rendi conto
che va bene è diverso contenuto, ma è di tipo
della stessa cosa; è un titolo della pagina e lista non ordinata.
Clicco settimana zero dal l'anno scorso, ed è una specie
della stessa cosa, un h1 tag e una lista non ordinata
e poi finalmente clicco questo, e mi capita di qualche foglia,
che è i vetrini dal quella particolare lezione.
Quindi qualcosa mi dice Sto per rabbrividire.
Se apro lezioni dot avviso php
che è praticamente la copia e incolla dal file precedente;
Ho appena cambiato il titolo h1, e ciò che questi collegamenti sono.
Peggio ancora, se vado in settimana zero virgola php,
è la stessa copia incolla di posti di lavoro
con solo un po 'di contenuto ottimizzato.
Quindi sicuramente c'è un opportunità qui per migliorare,
e sicuramente questo deve essere una buona regola;
ogni volta che senti te la copia
e incollando qualcosa più di una volta, forse,
bandiere rosse dovrebbero speriamo che iniziano a spegnersi.
Ma come andiamo su come migliorare questo?
Beh, ci sono un paio di modi, e le tecniche che è possibile utilizzare
in php si sono evoluti nel corso tempo, ma proviamo questo.
Lasciami andare in versione uno, così la prossima iterazione di questo,
e vorrei provare a ripulirlo un po '.
A destra, uno dei php di meccanismi più semplici
per risolvere questo problema è l' vecchia scuola richiede la funzione,
che praticamente fa una copia e incolla dei contenuti
di qualche file proprio qui, come c è tagliente includere,
e altre lingue hanno costrutti molto simili.
Così sembra un po ' strano ora,
non è sicuramente un completare guardando la pagina web,
ma probabilmente ciò che è all'interno di intestazione dot php.
Tutte le altre cose, a destra, il tag html, il tag head,
il tag title, tutta la roba che era sopra l'essenza principale
della pagina, che è senza dubbio solo la lista non ordinata,
e nel piè di pagina è probabilmente come il tag body chiuso,
tag del html chiuso; piuttosto interessante
ma roba di duplicazione.
Va bene, e sicura abbastanza se vado
in intestazione dot php è solo tipo di frammento orfano
dall'alto, e se andare in piè dot php,
è l'orfano frammento dal basso,
e sto usando quelle stesse frammenti in altri miei file,
come lezioni dot php.
Va bene, allora cosa c'è di meglio questo vuoi dire?
Sì?
Semplicità >>.
>> Semplicità?
Non conosco questo tipo di look molto più spaventoso per me, giusto?
>> Se volessi cambiare la vostra intestazione, non avreste
cambiarlo in tutte le precedente come i file.
Basta nuova modifica nell'intestazione.
>> Esattamente, quindi forse in questo senso è più semplice,
forse avrei inquadro come è solo che è più facile da aggiornare.
E 'forse un po' più pulito
perché si aggiorna in un solo posto.
Ecco, questo è abbastanza convincente; cosa c'è un rovescio della medaglia
di questo approccio o ciò che resta problema
che non abbiamo davvero risolto?
Sì?
[Commento Off Mic]
Sì, esattamente, voglio dire, io sono ancora copia e incolla;
è un po 'meno, ma ho solo tirato su due di questi file,
e hanno praticamente sembrava ancora identici.
C'era un bisogno nella top, un bisogno nella parte inferiore,
e una non ordinata elenco nel mezzo
che si era ancora Strutturalmente stesso.
Inoltre, notare questo, se io effettivamente vedere questo esempio,
lasciatemi andare alla versione One ora,
e notato ho CS50 Lecture Syllabus.
Uh oh, CS50 Settimana Zero Settimana Uno e CS50 Mercoledì Venerdì,
Ho tipo di taglio un angolo.
Quello che era - che erano quei titoli in precedenza?
[Commento Off Mic]
Erano come lezioni in Settimana Zero, come è stato gentile
di più sexy, e in realtà avuto un certo dinamismo ad esso,
e questo è una specie di - sono solo tipo di punting ora
e solo assumendo che l'intero sito è CS50
e va bene funziona, ma è certamente non elegante
o come una sorta di diritto trasmette come una volta,
ma questo ha un senso, perché se si guardano indice dot php
e lezioni dot php e la settimana zero virgola php,
sono tutti compresi lo stesso file,
così come possiamo migliorare questa?
Qual è la prossima iterazione del questo codice probabilmente intenzione di fare?
[Commento Off Mic]
Sì, esattamente, in modo da se - e fammi riassumere
con noi essenzialmente vogliamo parametrizzare tale intestazione
così che sì c'è ancora un hardcoded tag h1, ma la roba
in mezzo, al verde e il tag di chiusura,
è presumibilmente dinamico, e provenienti da qualcos'altro.
Forse il "get stringa" o il cosa dopo il punto interrogativo
nell'URL erano da qualche parte altro, quindi diamo un'occhiata.
Quindi se vado in versione a due,
ora accorgo che ho ha ottenuto un ulteriore file,
sembra aiutanti puntino php.
Io non so davvero dove iniziare così ho intenzione di cominciare solo
all'indice come come sempre, e ora notare che è un po 'diverso,
così ho preso una linea richiedono
nella parte superiore che richiede aiutanti dot php,
ma posso chiamarlo quello che voglio,
ma ora notare linea tre vi è una chiamata di funzione
per rendere intestazione, che è interessante solo in quanto
come ciò che è stato passato in a quanto pare, il titolo personalizzato
per questa particolare pagina.
Nel frattempo c'è rendering piè di pagina nella parte inferiore,
e non ho bisogno di alcun parametrizzazione non è solo
un piè di pagina, ma ora ci sembra
un passo verso una migliore soluzione, render intestazione prende,
e che cosa fare piazza parentesi indicano per coloro
che non hanno visto php mai o in un po '?
[Commento Off Mic]
Sì, è un array.
E 'un array associativo o un hash che associa chiavi
con valori; è come Java Scripts, notazione obiezione,
o altre lingue, syntaxs simili.
Va bene, allora che cosa è in aiutanti dot php?
In aiutanti puntino php è solo un paio di funzioni,
rendering intestazione e piè di pagina il rendering.
Così un paio di dettagli se meno familiare,
quindi prima di tutto il fatto
che rendono intestazione prende una argomento data che è apparentemente
assegnato il vuoto matrice lì cosa significa?
Che cosa significa fare equals Staffa aperto chiuso staffa
come parametro in php?
E 'il valore di default.
Quindi se non supero in matrice o un qualsiasi argomento di sorta
all'intestazione rendering o il rendering funzione piè di pagina,
Posso almeno fiducia come il autore di tali funzioni
che i dati saranno minimamente essere una matrice vuota;
non sarà indefinito o falso, o qualcosa del genere,
sarà esattamente quello Ho dato come predefinito.
Ora, questo è un po 'una sorta di un modo hackish di simboli di carico
nel vostro spazio nome per così dire,
ma funziona abbastanza bene verso questo fine
di attuare il nostro tipo di motore di template di povero.
Va bene, c'è un sacco di strumenti di là fuori per Python di Ruby
e php che ti danno funzionalità di templating
e questo è esattamente quello che vogliamo.
Noi vogliamo un modello che ha un tag h1 aperto, un h1 chiuso tag,
e una sorta di luogo titolare nel mezzo,
e vogliamo colmare quelle posto titolari di titolo di questa funzione,
quindi questa funzione estrarre così succede
per darvi la seguente capacità.
Se hai un associativa di array con coppie di valori chiave
come foo uguale bar, estratto creerà una variabile locale
chiamato segno efficace del dollaro foo e dargli un valore di bar
così esplode la vostra associativo matrice da coppie di valori chiave
in nuove variabili con i corrispondenti valori.
E poi richiedere intestazione dot dot php è la stessa di prima,
così che cosa stiamo probabilmente andando per vedere dentro di intestazione dot php?
E 'probabilmente ottenuto che il tag h1 e il tag di chiusura; cosa sta succedendo
essere all'interno di esso probabilmente tra esso?
[Commento Off Mic]
Esatto, c'è probabilmente qualche menzione del segno del dollaro titolo
e abbastanza sicuro se lo zoom in su questo c'è il mio tag title,
c'è il mio tag h1, e dentro di esso è un inserimento dinamico
del titolo simbolo del dollaro, ma per buona misura,
Sto facendo questo html speciale carica di nome atrocemente
funzione, ma è utile; che cosa fa
o che cosa protegge?
Questo è in realtà una soluzione ad una minaccia che si sta accennando;
si sarebbe ci ha portato a.
[Commento Off Mic]
Esattamente, quindi se un malintenzionato utente o una vittima ignara
di un attacco di phishing cliccato su un link
che in sé aveva un punto interrogativo e qualcosa come foo uguale,
e poi il valore di foo era in realtà
come parentesi aperta sceneggiatura, parentesi chiusa,
e poi alcuni di codice JavaScript;
se non si chiama questo lungo funzione principale,
si sarebbe effettivamente infettare html crudo nella vostra pagina web,
il cui risultato è che si può essere ingannato.
Si potrebbe essere ingannando l'utente in esecuzione del codice JavaScript
che lui o lei ha fatto in realtà non intendono.
E anche se di solito stai male solo a te stesso,
come solo tu conosci un idiota sta per digitare
nello script parentesi aperta, parentesi chiusa, e dire alert
o qualcosa di simile e fare se stesso
con qualche risultato strano, se vieni ingannato
a fare clic su un collegamento che ha JavaScript crudo incorporato in esso
come valore di quell'attributo,
si può tra le altre cose rubare i cookie di qualcuno
perché c'è una proprietà chiamato documento dot biscotto
in JavaScript che consente per afferrare cookie di sessione di un utente,
e se vi ricordate quello che un sessione attacco dirottamento è,
lunga storia breve, che è una modo effettivamente ingannare qualcuno
nel dare che virtuale timbro mano e poi prendere
sul loro account Facebook o qualche altro tipo di account.
Va bene, quindi questo è un po 'lungo,
ma è solo con codice html grezzo.
Questo è l'equivalente di chiamare echo
o stampare in modo efficace, e stiamo essenzialmente l'inserimento
che dinamicamente.
Quindi che altro resta qui?
Beh, mi permetta di andare in Versione Three qui,
e vedremo un po ' diversa -
stesso layout esatto del file ma bando
che questa volta andremo a generalizzare l'intestazione e il piè di pagina
come modelli, così che cosa Non voglio dire con questo?
Qual è l'unica cosa che è diverso qui?
Cosa è cambiato da l'ultima versione?
Sottile, ma è senza dubbio solo una migliore progettazione più pulito.
Sì?
[Commento Off Mic]
Sì, c'è solo un funzione standard di rendering;
Non ho caso speciale render intestazione o piè di pagina di rendering,
entrambi i quali se richiamo da aiutanti dot php,
siamo praticamente identici tranne i loro nomi
ed i modelli sono inclusi.
Perché non solo parametrizzare la funzione di rendering
e prendere un argomento, che è il nome del modello,
e un secondo argomento facoltativo che sono le coppie di valori di chiave
che si desidera inserire dentro
Quindi, se io ora guardo aiutanti dot avviso php
che io sia un poco amatore ora.
In realtà sto controllando fa l' il file esiste e se così andare avanti
e lo richiedono; nel caso in cui l'utente accidentalmente tipi
in qualche nome di modello falso si non voglio buttare un errore
nel programma in modo che possiamo minimamente fare loro questo
favorire qui.
Va bene, ma possiamo fare un passo ulteriore?
In questa versione qui notare quanto segue.
Ho appena digitato ls e ciò che salta subito
fuori è un po 'diverso.
Quindi ci sono due directory, a destra,
e quindi questo è ora un passo verso Come sarà alla fine una più
quadro adeguato.
Questo è il tipo di sciatta a me da buttare tutti
del mio contenuto all'interno di un directory accessibile pubblicamente
che letteralmente si chiama pubblico.
E anche se, purtroppo, un sacco di quadri,
quelli più anziani in particolare, e anche alcuni post web,
Sogno Host fra loro, le forze di mettere tutti i file
nell'equivalente di un elenco pubblico anche
se i file potrebbero includere password del database
e nomi utente o altri tali credenziali,
che non è affatto un buon design.
Molto meglio è messo solo
nella directory pubblica ciò che assolutamente è
per essere accessibile all'utente, e tutto il resto
che si sta inclusi come aiutanti dot php,
non c'è ragione che tale dovrebbe essere web accessibile tramite un
browser con un URL.
Potrebbe essere completamente innocuo se l'utente desidera vedere forse
che coppie, ma è solo il principio di esso,
e Dio non voglia realmente fa disporre di un nome utente o la password;
non si desidera che il utente accidentalmente
o intenzionalmente essere in grado di accedervi.
Quindi non siamo del tutto a un perfetto approccio qui,
a meno di notare quanto segue ora.
In indice dot php, notare che Sto ancora richiede aiutanti,
ma lo sto facendo in modo che sto sorta di organizzare tutto
dei file sarà incluso
in una sottodirectory chiamata convenzionalmente comprende,
e poi chiamo il rendering per Intestazione e piè come prima.
Quindi l'unica cosa Ho fatto è una sorta
di riorganizzare i miei elenchi ad essere un po 'più anale
circa la struttura del file.
Ma se ora andiamo a questo quinto esempio,
notare qui che noi ora avere un trio di cartelle,
e questo è un po ' fuorviante per il momento
perché per semplicità per il bene della classe,
Ho appena buttato tutto
in John Harvard di Directory pubblica solo
così possiamo navigare via un browser, ma gara -
ignorare questa parte solo per un attimo,
il fatto che io sono lì.
Si noti che ho tre sottodirectory: pubblici,
modelli, e comprende.
L'idea ora è che in un configurato correttamente server web I
avrebbe detto Apache che questo sito accessibile al pubblico
file qui, e non altrove.
Allora, cosa ne pensi di file Io vado a vedere dentro
del pubblico se digito ls?
Cosa c'è almeno un file che probabilmente è lì dentro?
[Commento Off Mic]
Ok indice dot php, e ciò che il file non è ovviamente
in là, tra gli altri?
Come aiutanti dot php, intestazione dot php, piè di pagina dot php;
tutti i frammenti, tutte le funzionalità
che non ha veramente bisogno per essere accessibile al pubblico,
deve essere utilizzabile dai file
che sono accessibili al pubblico, ma essi stessi,
nessun utente ha bisogno di vedere o quaderno un URL per aiutanti dot php.
Si noti che se invece vado
in include c'è aiutanti dot php,
e se vado in modelli,
c'è piè di pagina e intestazione dot php.
Francamente, avrei potuto mettere li nella stessa directory,
ma sto cercando di essere ancora più anale su come mantenere i file
che sono solo una sorta di modelli statici diversa
da file funzionali come aiutanti dot php,
e sto solo aderendo ad alcuni convenzioni abbastanza comune
chiamando le directory comprende e modelli.
Quindi l'unica cosa che cambiato poi è di nuovo il percorso.
Se andiamo qui notare che ora appena ho
per includere una directory relativa,
dot dot barra comprende aiutanti dot php,
o posso essere un po 'più corretta ed effettivamente fare qualcosa
come questo, php e un sacco
di lingue hanno questi simboli speciali
che rappresentano la directory del file corrente,
così sottolineatura sottolineatura dir sottolineatura sottolineatura rappresenta
qualunque directory è di questo file,
e così se solo concatenare con l'operatore punto, che,
che sarebbe raggiungere lo stesso risultato,
e tende ad essere un po 'più robusta perché si può ottenere
in situazioni con relativa directory sono stati solo dicendo dot
o dot dot può effettivamente si mettono al posto sbagliato,
quindi questo tende ad essere un po 'più robusto.
Va bene, allora che cosa sebbene resti?
Cosa fare ancora non mi piace di questo?
Che cosa potrebbe essere migliorato e commentato in precedenza credo
che ci sono ancora alcuni problemi?
[Commento Off Mic]
Destra, sicuramente non abbiamo per iniziare a scrivere come siti
quello sguardo come questo, giusto?
Questo non si sente tutto molto meglio,
c'è ancora copia incolla.
Ho ancora l' richiedono riga in alto.
Ho ancora render intestazione rendering piè di pagina.
C'è un sacco di doppioni.
Sì?
[Commento Off Mic]
Sì, esattamente, così abbiamo preso un primo passo verso una sorta di scissione
la "c" dalla "v", così MVC è Model View Controller;
Controller è una sorta di cervelli dell'applicazione.
Modello tende ad essere dati o alcune funzionalità in comune,
e vista tende ad essere la estetica, il modello,
così abbiamo compiuto un passo verso la separando la "c" dal "v"
perché ora almeno abbiamo directory di questo modello,
ma anche lì abbiamo essenzialmente avere un controller per file.
Non sembra che ci sia molta logica succedendo qui,
ma indice dot php è efficacemente un controller.
Quando si visita un indirizzo e terminano in punti indice php,
tutta la logica che implementa questa pagina è giusto
nell'indice dot php, e stesso per le lezioni dot php.
Lo stesso per la settimana zero virgola php.
Così abbiamo tipo di Strone nostra logica di tutto il luogo,
e ci si sente come questo non sta andando
di scalare molto bene una volta non sono quattro, ma quaranta pagine
se ogni pagina inizia con me la copia di una versione precedente
del file e solo tweaking alcuni
del contenuto all'interno di esso.
Così abbiamo preso solo un passo verso questo,
e uno degli strumenti ci presentiamo
il Mercoledì è un corniciaio chiamato "Laravel"
e questo è molto framework php popolare,
altre sono "Fuelphp".
C'è un più vecchio chiamato "Codeigniter."
Ce n'è uno chiamato "Cake".
Ce n'è uno chiamato "Sinfonia".
Voglio dire, se Google framework PHP,
c'è un atroce numero di framework come
che le persone che attuate.
Laravel è uno dei più e chi arriva;
è uno dei più pulito quelli, e troverete
che infine aiuta risparmiare un bel po '
di tempo anche se c'è un po 'di una curva di apprendimento,
ma che noi guideremo voi sopra il Mercoledì.
Inoltre, si introducono ciò che chiama una "ORM".
In questo caso, useremo qualcosa che viene
con questo framework chiamato Laravel.
Si chiama "eloquente" e questo è solo uno strato di codice
che permette tra l'altro cose parlano dei database.
E anche qui, mi permetta di rubare un esempio che è o recente
o un ritorno al passato per alcuni di voi da 50.
Se avete preso 50, e hai fatto "CS50 Finanza,"
si potrebbe richiamare i file che si scrive o riscritta quello sguardo
come questo, questo era il login php dot, e al momento,
soprattutto perché abbiamo non spendere molto tempo
sui fondamentali php presto,
questo potrebbe avere di per sé stato abbastanza impegnativo,
e così abbiamo fatto, infatti, cercare di semplificare la progettazione.
Non abbiamo davvero separarci "M" da "V" da "C" di tanto
per i problemi che "Seven CS50 Finanza,"
a meno di notare una cosa che dovrebbe auspicabilmente cominciare
a strofinare presto il male modo, è qualcosa di simile.
Voglio dire, non solo è stato questo Login php punto un controllore.
E 'stato anche parlando direttamente
a un database specificamente utilizzando sequel, che non sta andando
di scalare molto bene quando si inizia a lavorare con una sola
o due o tre partner.
Per esempio, se uno dei le parti è responsabile
per la creazione tabelle del database e provenienti
con gli indici e capire
ciò che la chiave dovrebbe essere, il chiavi primarie, chiavi esterne,
e tutto questo, decidere i nomi delle tabelle e tutto il resto.
Ora è l'altra persona in il gruppo ha bisogno di sapere tutto
delle decisioni di progettazione che lui o lei ha fatto, ed è ora necessario
codificare tali decisioni nel file, così ora
o lei è piuttosto molto vincolata
a mai più cambiare questi i nomi delle tabelle.
Mai più cambiare quei nomi depositati
senza informare.
Inoltre, non si può davvero facilmente lavorare sullo stesso file
senza scontrarsi con l'altro se
o lei è costantemente modifica dei nomi,
e avete il vecchio versioni e così via,
quindi questo è solo invitante un sacco di mal di testa.
Inoltre, come faremo vedere prima lunga,
anche se non hai bisogno
fare particolare query sofisticate qui,
una volta che si iniziano ad avere più tavoli, due tavoli, tre, cinque,
dieci tavole in MySql o generalmente un database relazionale,
è necessario unire le tabelle spesso se familiare, e si dispone
per combinare i dati di uno con l'altro,
e francamente vostre domande sequel inizia ad allungarsi, e più a lungo,
e più, e più complesso, e si inizia solo
per ottenere un sacco più facile di fare errori
e molto più difficile da ottenere le cose per bene.
E così strumenti come Eloquente e ORM sta andando
per aiutarci a modellare i nostri dati e è anche efficace va
per generare il codice che ci necessario avviare interrogazione di banche dati
in modi più sofisticati.
Quindi, se hai una chiave primaria qui e una chiave esterna
qui, tutto ciò che serve da fare è insegnare che ORM,
Object Relation Mapper, ciò che rapporto è
e sarà capire cosa query da eseguire per voi.
E solo in rari casi avete bisogno
scrivere necessariamente codice sequel te.
Se davvero si vuole sintonizzare qualcosa,
ma per la maggior parte, si può basta iniziare a trattare entità
nei database come vero oggetti e non queste righe piatte
che in qualche modo necessario ricostruire e de normalizzare.