PHP

Wikipediasta
Siirry navigaatioon Siirry hakuun
PHP
Paradigma olio, proseduraalinen
Tyypitys heikko
Muistinhallinta automaattinen
Julkaistu 1995
Kehittäjä The PHP Group
Vakaa versio 8.3.6 ()[1]
Vaikutteet C, Perl
Verkkosivu php.net
Uutisryhmä comp.lang.php
Lisenssi PHP License 3.01

PHP (lyhenne sanoista PHP: Hypertext Preprocessor) on Perlin kaltainen palvelinpuolen skriptikieli, jota käytetään erityisesti web-palvelinympäristöissä dynaamisten verkkosivujen luonnissa.[2] Ohjelmointikielen lisäksi PHP-ympäristössä on laaja luokkakirjasto. PHP on avoimen lähdekoodin komentosarjakieli, jossa ohjelmakoodi tulkitaan vasta ohjelman suoritusvaiheessa. PHP sai alkunsa vuonna 1995 Personal Home Page -työkalujen (PHP Tools) nimellä. Alusta alkaen sen tärkeä käyttöaihe oli verkkosivujen lomakkeiden tulkinta.[3]

PHP:n ensimmäisen version julkaisi tanskalais-kanadalainen Rasmus Lerdorf vuonna 1995 ohuena mallinejärjestelmänä, mutta pian käyttäjät alkoivat pakottaa siihen uutta ja kattavampaa toimintalogiikkaa[4]. PHP muistuttaa sen historiallista kilpailijaa, Microsoftin Active Server Pages (ASP) -teknologiaa, jota ajettiin Windows-palvelimella. PHP sen sijaan sopi ilmaisen Linux-käyttöjärjestelmän kanssa yhteensopivalla ilmaisella Apache-palvelimella ajettavaksi. PHP:n kilpailija oli myös JavaServer Pages (JSP). PHP:n käyttöaiheita olivat lomakkeet ja niihin kytkeytyvän lähetä-painikkeen toiminnallisuus. PHP luki tietokantaan tallennettua tietoa ja kirjoitti sinne uutta sisältöä verkkosivun lomakekentästä. PHP sopi yhteen ilmaisen MySQL-tietokannan kanssa. Yleinen palvelinpuolen ohjelmistopino alettiin tuntea nimellä LAMP (Linux, Apache, MySQL, PHP). PHP nousi 2010-luvun alussa suosituimmaksi dynaamisten web-palveluiden tuottamiseen tarkoitetuksi tekniikaksi.[5][6] Erään työnvälityssivuston mukaan PHP-osaajat olivat halutuimmillaan 2011 ja siitä lähtien kielen suosio on ollut laskussa.[7]

HTML-koodin sekaan upotetuista skripteistä, jotka mahdollistivat dynaamiset verkkosivut, yleiseksi web-kehityksen suunnaksi alkoi muotoutua MVC-arkkitehtuuri (toimintalogiikka erotettu esityslogiikasta). PHP:lle ilmestyi lisää kilpailua varsinkin Ruby- ja Python-kielistä. JavaScript-kielen käyttöaiheet alkoivat laajentua Ajax:n myötä datan lähettämiseen palvelinpuolelle, ja lomakkeet ja painikkeet kehittyivät JavaScriptin varaan.

Historia[muokkaa | muokkaa wikitekstiä]

Vuonna 1994 tanskalais-grönlantilainen Rasmus Lerdorf kirjoitti pienen kokoelman C-kielisiä CGI-skriptejä[8] nimellä Personal Home Page Tools. Lerdorf julkisti työkalut GPL-lisenssillä 8. kesäkuuta 1995 nimellä PHP/FI (Personal Home Page / Forms Interpreter). [9]

PHP/FI 2.0 julkaistiin marraskuussa 1997, ja sillä oli useita tuhansia käyttäjiä ympäri maailmaa. Ohjelma oli asennettu noin 50 000:een domainiin (yksi prosentti kaikista internetin domaineista) ja useat ihmiset osallistuivat sen kehittämiseen. Projekti oli yhä Rasmus Lerdorfin päävastuulla.

Andi Gutmans ja Zeev Suraski totesivat PHP/FI 2.0:n riittämättömäksi internet-kauppasovelluksen tarpeisiin. He kirjoittivat lähes koko lähdekoodin alusta asti uudelleen ja julkaisivat sen kesäkuussa 1998 nimellä PHP 3. Lyhenteen uudeksi merkitykseksi valittiin rekursiivinen PHP: Hypertext Preprocessor.

Talvella 1998 Gutmans ja Suraski aloittivat PHP:n ytimen uudelleen kirjoittamisen. Heidän tavoitteenaan oli ydin, joka tukisi kolmansien osapuolten ohjelmointirajapintoja. Uusi ydin julkaistiin vuonna 1999 nimellä Zend Engine (yhdistelmä nimistä Zeev ja Andi) ja maaliskuussa 2000 julkaistu PHP 4 käyttää sitä ytimenään.[10]

PHP 5 julkaistiin heinäkuussa 2004. Sen ytimenä on Zend Engine II, joka muun muassa tukee olio-ohjelmointia ja sisältää sisäänrakennetun tietokantamoottorin (SQLite). PHP 4:n virallinen tuki päättyi 8. elokuuta 2008.[11][12]

PHP:n versio 7.4.11 julkaistiin 1. lokakuuta 2020.[13] PHP 8:n julkaisuehdokas on julkaistu testattavaksi 1. lokakuuta 2020.[14]

Syntaksi[muokkaa | muokkaa wikitekstiä]

PHP:tä käytetään yleisimminlähde? HTML-sivuihin upotettuna. PHP-koodin aloitus- ja lopetustunnisteet ovat <?php ja ?>.[15] Tulostamiseen voi käyttää aloitustunnistetta <?=.[16]

<html>
<head>
  <title>PHP-testi</title>
</head>
<body>
  <p><?php echo 'Hei maailma!'; ?></p>
  <p><?= 'Hei taas!' ?></p>
</body>
</html>

Kun sivujen käyttäjän selain lähettää pyynnön yllä olevasta sivusta, palvelin käyttää koodin PHP-tulkilla. Tulkki ei käsittele mitään tekstiä, joka on aloitus- ja lopetustunnisteiden ulkopuolella[16]. Se palauttaa valmiin sivun palvelimelle, joka lähettää sen edelleen selaimelle.

<html>
<head>
  <title>PHP-testi</title>
</head>
<body>
  <p>Hei maailma!</p>
  <p>Hei taas!</p>
</body>
</html>

Koodiesimerkkejä[muokkaa | muokkaa wikitekstiä]

Tekstin tulostaminen:

<?php
// Molemmat rivit tulostavat saman tekstin
echo 'Huomenta, wikipedistit!';
print 'Huomenta, wikipedistit!';
?>

Tiedoston lukeminen:

<?php
$file = fopen('tiedosto.txt', 'r');
$content = fgets($file);
fclose($file);
?>

Tiedostoon kirjoittaminen:

<?php
$file = fopen('tiedosto.txt', 'w');
$content = fgets($file);
fclose($file);
?>

Ehtolauseet:

<?php
if ($a > $b) {
  echo 'a on suurempi kuin b';
} elseif ($a < $b) {
  echo 'a on pienempi kuin b';
} else {
  echo 'a on yhtä suuri kuin b';
}
?>

Tulostuksen kuolettaminen:

<?php
die;
?>

Muuttujat[muokkaa | muokkaa wikitekstiä]

PHP:n muuttujat ovat heikosti tyypitettyjä, eli ne voivat saada minkä tahansa tyyppisen arvon kontekstista riippuen. Datatyyppejä ovat totuusarvo (boolean), kokonaisluku (integer ~ int), liukuluku (float ~ double), merkkijono (string), taulukko tai matriisi (array), olio (object), ulkoinen resurssi (resource) ja tyhjä (null).[17]

Muuttujia merkitään niiden nimeä edeltävällä dollarinmerkillä. Muuttujan nimessä voi olla kirjaimia, numeroita tai alaviivoja. Se ei saa kuitenkaan alkaa numerolla.[18]

Oliot[muokkaa | muokkaa wikitekstiä]

PHP 4:ssä oli perustoiminnot luokkien ja olioiden käsittelyyn, mutta toiminto kirjoitettiin täysin uusiksi PHP 5:een. PHP 5:n olio-ominaisuuksissa on muun muassa julkisia (public), yksityisiä (private) ja suojattuja (protected) muuttujia ja funktioita, abstrakteja luokkia ja funktioita, luokkien periytyminen sekä poikkeusten käsittely.

Olion julkisia muuttujia voi lukea ja kirjoittaa vapaasti mikä tahansa ohjelman osa ja julkisia metodeja voi kutsua mistä tahansa ohjelman osasta. Yksityisiä metodeja voidatan lukea ja kirjoittaa vain luokan metodeista ja yksityisiä metodeja voi kutsua vain luokan metodit. Suojatut metodit ja muuttujat ovat julkisia alaluokille ja yksityisiä kaikille muille ohjelman osille. Luokka viittaa itseensä avainsanalla this.

Esimerkki:

<?php
class Piste {
  private $x;
  private $y;

  // Metodi, joka ajetaan, kun luokalle tehdään ilmentymä
  public function __constructor() {
    $this->x = 1;
    $this->y = 1;
  }

  public function set($x, $y) {
    $this->x = $x;
    $this->y = $y;
  }

  public function getX() {
    return $this->x;
  }

  public function getY() {
    return $this->y;
  }
}

$pisteA = new Piste(); // Tekee luokasta Piste ilmentymän pisteA
$pisteA->set(10, 40);  // Asettaa ilmentymän arvoiksi x = 10 ja y = 40
echo "Luokan pisteA x = {$pisteA->getX()} ja y = {$pisteA->getY()}";
?>

Abstraktilla luokalla on abstrakteja metodeja, jotka ovat tyhjiä. Abstraktia luokkaa voidaan käyttää, jos halutaan paljon luokkia, mutta halutaan, että ne ovat saman luokan alaluokkia ja että niissä on samannimiset metodit ja muuttujat. Abstraktille metodille tosin voi luoda alaluokkia ja niissä metodit voi määrittää.

Esimerkki:

<?php
abstract class Verotus {
  protected $alv;
  protected $kansa;

  public __construct($alv = 0) {
    $this->alv = $alv;
    $this->kansa = 1000;
  }

  public function get() {
    echo "ALV: {$this->alv}<br>";
    echo "Väkiluku: {$this->kansa}";
  }

  public abstract function set();
}

class KansaPoistuu extends Verotus {
  public function set() {
    // Määritetään Verotus-luokasta perityille muuttujille uudet arvot
    $this->alv++;
    $this->kansa--;

    // Kutsutaan Verotus-luokan get-metodia
    $this->get();
  }
}

// Luodaan uusi KansaPoistuu-luokan ilmentymä
$verottaja = new KansaPoistuu();

for ($i = 0; $i < 150; $i++) {
  // Kutsutaan verottaja-olion set-metodia
  $verottaja->set();
}
?>

Luokkakirjastot[muokkaa | muokkaa wikitekstiä]

Pääartikkeli: PHP:n luokkakirjastot

PHP:ssä on laaja luokkakirjasto. Luokkakirjastoja on useille eri toiminta-alueille, kuten merkkijonojen ja päivämäärien käsittelyyn, HTTP-protokollalle, useiden eri tiedostotyyppien muokkaukseen ja ulkoisille tietokannoille. PHP on tukenut versiosta 3 lähtien kolmansien osapuolien ohjelmointirajapintoja (API).

Tietokantakohtaiset luokkakirjastot[muokkaa | muokkaa wikitekstiä]

PHP:ssä on tietokantatuki muun muassa MySQL-, PostgreSQL-, SQLite- ja Oracle-tietokannoille. ODBC-luokkakirjastossa on yhtenäinen rajapinta muun muassa Adabas D-, IBM DB2-, iODBC-, Solid- ja Sybase SQL Anywhere -tietokantoihin.

Kritiikkiä[muokkaa | muokkaa wikitekstiä]

PHP:lle ei ollut virallista määritelmää ennen vuotta 2014, vaan olemassa oleva toteutus ja sen toiminta oli de facto -standardi.

PHP:tä on pidetty tietoturvaltaan heikkona. Vanhemmissa versioissa oli oletusarvoisesti päällä toiminto, jolla loppukäyttäjät pystyivät syöttämään muuttujia suoraan PHP-skriptiin (register_globals). Toiminto on oletusarvoisesti poissa päältä versiosta 4.2.0 lähtien,[12] mutta moni vanhempi ohjelmisto on kehitetty oletuksella, että register_globals -valinta on käytössä. Toiminto poistettiin kokonaan versiossa 5.4.0 [19]

Kaikki kolme PHP:n pääversiota ovat keskenään yhteensopimattomia. Ehkä tästä syystä sivustojen päivittyminen on ollut hidasta. Kesti kolme vuotta julkaisusta ennen kuin PHP 5 ohitti suosiossa vanhan PHP 4:n.[20]

PHP:n sisäinen yhtenäisyys on hataraa. Jotkin kirjastofunktiot hyväksyvät argumentit eri järjestyksessä kuin toiset. Lisäksi PHP:ssä on useita toiminnaltaan identtisiä funktioita. Valmiiden funktioiden nimet ovat myös usein poikkeavia nimeämiseltään,[20] esimerkiksi str_rot13 ja strtolower. Virheiden jäljittäminen ja korjaaminen on hankalaa puutteellisten työkalujen ja virheilmoitusten vuoksi. PHP:ssä on jopa @-operaattori, jolla koodin virheet voi jättää huomiotta.[21]

Suunnitteluvirheiden vuoksi turvallisen koodin tekeminen vaatii erityistä tarkkuutta. Esimerkiksi funktio strpos ja vastaavat palauttavat arvon 0, jos etsittävä merkkijono löytyy merkkijonon alusta. Jos haettavaa ei löydy, palauttaa funktio arvon false. Käytettäessä tätä arvoa parametrina PHP muuttaa arvon false automaattisesti arvoksi 0, jos parametrina vaaditaan lukuarvoa. Useissa muissa ohjelmointikielissä virheellinen arvo aiheuttaisi virhetilanteen, joka pysäyttää ohjelman.[21]

Koodin toimiminen riippuu tulkin käännösasetuksista ja sen asetustiedostoista.[21]

PHP on hidas, jopa Javaa hitaampi. PHP:n luojalta Lerdorfilta kysyttiin haastattelussa miten PHP:tä voisi nopeuttaa. Hänen vastauksensa oli ”Well, you can’t.” (No, ei sitä voi).[20]

PHP-ohjelmissa ei ole sisäänrakennettua tapaa käsitellä säikeitä, mikä tekee suurten tietomäärien käsittelystä yhden PHP-skriptin sisällä vaikeaa.

PHP:n sisarprojektit[muokkaa | muokkaa wikitekstiä]

PHP:llä on kolme sisarprojektia:

  • PEAR (PHP Extension and Application Repository)
  • PECL (PHP Extension Community Library)
  • PHP-GTK.

Tunnettuja projekteja, jotka hyödyntävät PHP:tä[muokkaa | muokkaa wikitekstiä]

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. Version 8.3.6, (viitattu ). Tieto on haettu Wikidatasta.
  2. What is PHP? PHP.net. Viitattu 6.3.2007. (englanniksi)
  3. Rasmus Lerdorf: Announce: Personal Home Page Tools (PHP Tools) 8. kesäkuuta 1995. Uutisryhmät. Viitattu 13.8.2007. (englanniksi)
  4. https://hendrikprinsza.medium.com/the-history-of-php-from-1995-to-2023-f5a1bae63554
  5. TIOBE Programming Community IndexArkistoitu kopio TIOBE. TPCI. Arkistoitu 29.11.2007. Viitattu 1.2.2007. (englanniksi)
  6. Usage of server-side programming languages for websites W3Techs. Viitattu 30.1.2011. (englanniksi)
  7. Orsini, Lauren: PHP, Once The Web’s Favorite Programming Language, Is On The Wane ReadWrite. 11.8.2014. Viitattu 7.7.2017. (englanniksi)
  8. Lerdorf, Rasmus: Re:There ARE other scriping languages besides PHP (Keskustelupalstan viesti) Slashdot. 15.9.2006. Viitattu 6.3.2007. (englanniksi)
  9. Lerdorf, Rasmus: Announce: Personal Home Page Tools (PHP Tools) Google-ryhmät. 8.6.1995. Viitattu 6.3.2007. (englanniksi)
  10. History of PHP and Related Projects PHP.net. Viitattu 6.3.2007. (englanniksi)
  11. PHP 4 end of life announcement PHP.net. 13.7.2007. Viitattu 30.10.2007. (englanniksi)
  12. a b PHP 4 ChangeLog PHP.net. 7.9.2008. Viitattu 30.10.2007. (englanniksi)
  13. Downloads PHP. Viitattu 22.10.2020. (englanniksi)
  14. PHP 8.0.0 Release Candidate 1 available for testing PHP. Viitattu 22.10.2020. (englanniksi) 
  15. PHP tags PHP.net. Viitattu 17.5.2019. (englanniksi)
  16. a b Escaping from HTML PHP.net. Viitattu 17.5.2019. (englanniksi)
  17. Types PHP.net. Viitattu 7.3.2007. (englanniksi)
  18. Basics PHP.net. Viitattu 7.3.2007. (englanniksi)
  19. Using Register Globals PHP.net. Arkistoitu 1.4.2017. Viitattu 30.3.2017. (englanniksi)
  20. a b c Orsini, Lauren: PHP, Once The Web’s Favorite Programming Language, Is On The Wane ReadWrite. 11.9.2014. Viitattu 7.7.2017. (englanniksi)
  21. a b c PHP: a fractal of bad design Fuzzy notepad. 9.2.2012. Viitattu 7.7.2017. (englanniksi)

Kirjallisuutta[muokkaa | muokkaa wikitekstiä]

  • Rantala, Ari: Web-ohjelmointi. Docendo, 2005. ISBN 951-846-264-X.
  • Gilmore, W. Jason: Beginning PHP and MySQL 5: From Novice to Professional, Second Edition. Apress, 2006. ISBN 1-59059-552-1. Myös suomeksi: Gilmore, W. Jason: PHP & MySQL 5 Tehokas hallinta. Gummerus, 2006. ISBN 952-5592-11-1.
  • Tatroe, Kevin; Lerdorf, Rasmus & MacIntyre, Peter: Programming PHP. O’Reilly Media, 2006. ISBN 0-596-00681-0. (englanniksi)

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]

Wikibooks
Wikibooks
Wikikirjastossa on aihe: PHP.