WWW-ohjelmointi ANTTI SAND TIETA12
Funktio ja luokat 2
PHP on sekä funktionaalinen, että OO 3 Funktio debuggaukseen Var_dump() tulostaa muuttujan arvon Die() lopettaa ohjelman suorituksen Die(var_dump($var)); on käytännöllinen keino tarkastella muuttujaa Laajennetaan se funktioksi Function dd($data) { echo <pre> ; var_dump($data); echo </pre> ; die(); }
Laajennetaan micro frameworkkiamme 4 Luodaan uusi hakemisto funktioille ja siirretään dd() sinne. Index.php lataa funktiotiedoston ja saa pääsyn kutsumaan funktiota.
Luokat 5 Public, protected $this->propertyname $this->methodname() Magic methods construct, clone, get,
Luokat 6 On hyvin tavallista käyttää taulukkoa luokkainstanssien tietorakenteena. Sama nuolisyntaksi toimii edelleen.
7 PHP ja *SQL PDO
Esimerkkinä MySQL / MariaDB 8 MySQL kaikkein suosituin avoimen lähdekoodin tietokanta, toiseksi eniten käytetty kaikista tietokannoista MariaDB on alkuperäisen kehittäjän drop-in replacement MariaDB on kuitenkin hiukan jäljessä mm. Json-kenttien ja klusteroinnin osalta Mutta perusasioissa toimii yksi yhteen Jos asensit XAMPP, MAMPP, tai LAMPP paketin, tai jos asensit Vagrantin ja siihen ohjelmat, sinulla on jo MySQL tai MariaDB asennettuna Jos asensit brew kautta, asenna myös brew install mysql Koulun koneilla PostgreSQL, mutta koska tietokantarakenne abstraktoidaan, sovellus ei riipu tietystä tietokantamoottorista
Ensin valmisteluja 9 Luodaan uusi tietokanta esimerkkidatalle: Sitten lisätään sinne taulu tietorakenteelle:
PHP PDO 10 PHP tukee funktionaalisia tietokantafunktioita, mutta sisältää myös OOP tietokantaluokan Funktionaaliset komennot sidottuja tiettyyn tietokantatoteutukseen (mysql_connect, ), johtaa vahvaan sidokseen tiettyyn tietokantaan (mysql) PDO luokan avulla tietokanta abstraktoidaan ja voidaan helpommin vaihtaa toteutuksesta toiseen https://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-fordatabase-access--net-12059
PDO ja tietokannat 11
DSN data source name 12 DSN määrittää tietokantayhteyden PDO:lle Hostname tai IP Portti Tietokannan nimi Merkistökoodaus, DSN vaihtelee riippuen itse tietokantatoteutuksesta (MySql, PostgreSQL) PDO luokan konstruktori aiheuttaa poikkeuksen PDOException, jos yhteyttä ei voitu muodostaa
Prepared statement 13 $pdo->prepare() valmistelee kyselyn suorittamista varten Valmistelussa mahdolliset muuttujat sidotaan niille varatuille paikoille EI: DELETE FROM users WHERE id = $_GET[ id ]; OK: DELETE FROM users WHERE id = :muuttuja; Jos muuttujat otettaisiin suoraan mukaan kyselyihin, se altistaisi SQL Injektion hyökkäykselle (tästä lisää omalla luentokerrallaan) Prepared statement sanitoi muuttujat siten, että ne eivät aiheuta kyselyssä sivuvaikutuksia Se ei kuitenkaan validoi syötettä, eli varmista, että muuttuja olisi oikeaa tyyppiä
Value binding 14 Käyttäjältä tulevaa syötettä ei saa konkatenoida osaksi kyselyä, koska se altistaa SQL Injektiolle PDO luokka tarjoaa bindvalue() metodin muuttujien turvalliseen sitomiseen, estäen SQL Injektioita
Data mapping 15 Voidaan hakea assosiatiivinen taulukko Tai voidaan hakea luokan instansseina Luokan instanssista voidaan kutsua luokan metodeja ja käyttää nuolisyntaksia $task[0]->description; vs. $task[0][ description ];
PDO hakuliput 16 PDO::FETCH_ASSOC Assosiatiivinen taulukko, sarakkeen nimi avaimena PDO::FETCH_NUM Indeksoitu taulukko, sarakkeen numero avaimena PDO::FETCH_BOTH Yhdistää kaksi edellistä PDO::FETCH_CLASS Palauttaa objektin, jonka ominaisuuksina sarakkeiden nimet, kutsuu luokan konstruktoria PDO::FETCH_OBJ Palauttaa standardiobjektin, jonka ominaisuuksina sarakkeiden nimet
PDO ja luokat 17 Jos haetaan tietoa luokan instanssina, voidaan luokkaan määritellä julkiset muuttujat vastaamaan tietokannan sarakkeita Mutta ne voidaan jättää myös määrittelemättä PHP:ssa on standardi luokka stdclass $dog = new stdclass; $dog->name = jeff ; // voidaan dynaamisesti lisätä julkisia muuttujia luokkaan Luokan instansseihin voidaan dynaamisesti lisätä julkisia muuttujia ja sulkeumia
Refaktoroidaan micro frameworkkia 18
Refaktoroidaan luokkiin 19
Static -keyword 20
Muuttujat pois koodin seasta 21
Ensimmäinen tietokantaluokka 22
Luokan 23 vastuu QueryBuilder ottaa vastuulleen PDO:n käytön Valmistelee kyselyn Sitoo muuttujat Ajaa kyselylauseet Palauttaa tulokset
Lisätään 24 tyypitys Eksplisiittinen tyypitys on vapaaehtoista Mutta pienellä metodilla sekin saadaan asetettua vastaamaan PHP:n muuttujan tietotyyppiä Ilman tyypitystä PDO saattaa joissain tapauksissa johtaa 1 => 1 TIETA12-2017 - A.S.
Lukumetodit 25 Vastuut jaettu luokan sisällä metodeille Mieti, miten haluaisit käyttää luokkaa ja suunnittele luokan metodit sen mukaan
CRUD 26 Create Read Update Delete
Create 27
Read 28
Update 29
Delete 30
Luonnollisempi API ketjuttamisella 31 Jos luokan metodi palauttaa luokan instanssin (l. Itsensä), voidaan metodeja ketjuttaa Nyt voidaan ketjuttaa komennot jonoksi
Tietokantaluokan hyödyntäminen 32
Tietokantaluokan käyttö 33 Jos Model tyypin luokka haluaisi vastata tietojensa käsittelystä tietokannan kanssa (kuten MVC:ssä halutaan), miten se saa pääsyn tietokantaluokkaan? Luokassa Task on metodi getall(), jonka tulisi palauttaa kaikki rivit tietokannan taulusta todo. Tähän Task tarvitsee QueryBuilder luokan metodeja. Miten Task voi saada käsiinsä $db muuttujan?
Globaali muuttuja? 34
Luokan instanssi parametrina? 35 Annetaan jokaiselle hyödyntävän luokan metodille parametrina viittaus tietokantaluokkaan? Pallotellaan muuttujaa paikasta toiseen Luokat ovat vahvasti riippuvaisia toisistaan Riippuvuuksista alkaa muodostua verkko Muutokset rakenteessa vaikeutuvat TIETA12-2017 - A.S.
Singleton 36 pattern
Singleton pattern? 37 Yleinen suunnittelumalli siihen, että saadaan täsmälleen yksi luokan instanssi Luokalla on staattinen muuttuja instanssi, yksityinen konstruktori ja julkinen staattinen metodi instanssin palauttamiselle Oikeastaan vain toisenlainen tapa luoda globaali muuttuja https://blogs.msdn.microsoft.com/scottdensmore/2004/05/25/why-singletonsare-evil/
Dependency Injection pattern 38 Luokka ei vastaa sellaisen luokan instanssin rakentamisesta, josta luokan toiminta riippuu, vaan luokka saa sen muualta Kutsuvalta luokalta Dependency injection containerista Käytetään myös termiä inversion of control http://php-di.org/doc/understanding-di.html https://en.wikipedia.org/wiki/dependency_injection https://en.wikipedia.org/wiki/inversion_of_control
39 Dependency Injection Container Staattinen luokka, johon voidaan varastoida riippuvuuksia Ja josta voidaan noutaa riippuvuuksia TIETA12-2017 - A.S.
DIC:n käyttö 40 Riippuvuutta aiheuttavat luokat voidaan nyt säilöä yhteen paikkaan ja hakea sieltä tarpeen mukaan Jos luokkaa pitäisi testata, sille voitaisiin asettaa halutut testiriippuvuudet
Tietoturvavaroitus 41 Tuotantopalvelimella web-palvelin tarjoilee yleensä public_html kansiota Nimeämiskäytäntö saattaa vaihdella Tuohon julkiseen kansioon tulee sijoittaa vain front controller ja staattiset resurssit, kuten kuvat, tyylitiedostot ja JavaScript Ohjelman koodit sijoitetaan tämän kansion ulkopuolelle Sinulla voisi olla siis vaikkapa ppt/app hakemistossa ohjelman koodi ja ppt/public_html/ssl hakemistossa vain index.php Huomaa, että require:n polut tulee määrittää suhteessa index.php tiedostoon (kontekstiin, jossa kutsutaan) Index.php kutsuu../../app/bootstrap.php, joka kutsuu config.php, mutta konteksti on index.php:n
Muutama sana tuotannosta 42
Kun haluat ohjelmasi maailmalle 43 Koulun palvelin on hyvin rajattu, eikä siihen saa tehdä muutoksia Siellä ei myöskään saa pyörittää juuri muuta kuin kurssien harjoitustehtäviä Kun haluat ohjelmasi maailmalle, sinulla on muutama vaihtoehto Shared hosting VPS Oma palvelin PaaS
Shared hosting 44 Hyvin halpa kotisivutila, jossa voi ajaa PHP ohjelmia Ohjelma kilpailee samoista fyysisistä resursseista muiden asiakkaiden kanssa Muisti, suoritinaika, siirtokaista Ei yleensä tarjoa SSH tunnuksia tai ei ainakaan tarjoa root oikeuksia Ei (yleensä) voida asentaa laajennoksia, kuten Memcached, Redis Ylläpito käytännössä (s)ftp:n yli, ei välttämättä versiohallinnasta Ei voida automatisoida tuotantoketjua commit, test, deploy Todella paljon tarjoajia ja poljetut hinnat, mutta harvoin riittää vakavasti otettavien palveluiden toteutukseen
Virtual Private Server 45 Kuin oma fyysinen palvelin, vaikkakin virtualisoitu Lähtöhinnaltaan vain vähän kalliimpi Yleensä puhdas käyttöjärjestelmäasennus ja root SSH oikeudet Fyysiset resurssit varattu asiakkaalle (maksat 2gb ram, saat 2gb ram) Oma IP-osoite Täysi vapaus asennella mitä haluaa ja toimia miten haluaa Mutta samalla vastuu kaikesta DEV-Ops toiminnasta Palomuuri, DNS, päivitykset, tietoturva, sähköpostipalvelin, Esimerkiksi Digital Ocean
Oma palvelin 46 Muuten sama, kuin VPS, mutta omat vastuut kasvavat Laiterikot (tarvitaan hot swap kiintolevyt ja käytännössä useampi varapalvelin ja liikenteen ohjaaminen rikkoutuneelta palvelimelta ehjälle mahdollisimman nopeasti, ) Sähkökatkokset (oma generaattori automaattisesti käyntiin) Varkaudet Verkkoyhteys (kiinteä IP, langallinen yhteys ja varalla mobiiliyhteys) Jäähdytys Vaatii käytännössä paljon rahaa ja jatkuvan päivystyksen, jos haluaa, että ohjelma on luotettavasti aina saatavilla
PaaS Platform as a service 47 Pilvipalvelu, jossa joku muu vastaa sekä raudasta, että suoritusympäristöstä Hieman kuin shared hosting, mutta kiinnitetyillä fyysisillä resursseilla ja kohdennettu sovelluskehittäjille Paremmat työkalut ylläpitoon, mutta ei niin laajoja valtuuksia, kuin omalla (virtuaali) palvelimella AppFrog, AWS, Engine Yard, Fortrabbit, Google App Engine, Heroku, Azure, Pagoda Box, OpenShift, Zend Developer Cloud) Myös ilmaisia tilauksia pienillä resursseilla, jotka riittävät juuri ohjelman demoamiseen, mutta harvoin raskaaseen käyttöön
Hyödyllistä luettavaa 51 What is Reflection (in PHP) http://culttt.com/2014/07/02/reflection-php/ What are PHP s Magic Methods? http://culttt.com/2014/04/16/php-magic-methods/ Dealing with times and dates in PHP http://culttt.com/2015/12/07/dealing-with-scheduling-in-php/
Kysymyksiä? 52