PHP5 - Nieuwe mogelijkheden en technieken Introductie en even voorstellen
Onlangs is PHP5 uitgekomen. PHP5 is een grote stap voorwaards voor iedereen die met deze populaire programmeertaal werkt. In deze presentatie bekijken we de belangrijkste nieuwe mogelijkheden die PHP5 biedt. Marco van Hylckama Vlieg Senior Web Developer Freelance docent Masterclass PHP
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Onderwerpen in deze presentatie
De Zend Engine 2.0: OO programmeren naar een hoger niveau getild. DOM XML: nu DOM Level 2 compliant SimpleXML: simpel met XML werken SQLite: SQL zonder database server Einde
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken
De Zend 2.0 engine
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0
private en protected members private en protected methods abstract classes en methods interfaces over constructors en destructors exception handling overige nieuwe mogelijkheden
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: private members
Een member variabele was in PHP4 altijd public en dus overal in de code op te vragen of te wijzingen. PHP5 introduceert de keywords private en protected om variabelen beter af te schermen. Class clsDemo { private $m_sTekst = "hallo"; function printTekst() { return $this->m_sTekst; } } $objDemo = new clsDemo(); echo $objDemo->printTekst(); echo $objDemo->m_sTekst;
PHP Conferentie 21 oktober 2004
De juiste manier om de member $m_sTekst te tonen is via een access method. Direct aanroepen via $object->member geeft: Fatal error: Cannot access private property clsDemo::$m_sTekst in /var/www/ demo/test.php on line 10
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: protected members
Protected members zijn alleen toegankelijk vanuit extending classes. Private members zijn niet gedefiniëerd in extending classes. 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18:
Class clsDemo { protected $m_sTekst = "hallo"; private $m_sPrive = "dit is geheim"; function printPrive() { echo $this->m_sPrive; } } Class clsDemoChild extends clsDemo { function printVars() { echo $this->m_sTekst."\n"; echo $this->m_sPrive; echo clsDemo::printPrive()."\n"; } } $objDemo = new clsDemoChild(); echo $objDemo->printVars(); echo $objDemo->m_sTekst; echo $objDemo->m_sPrive;
PHP Conferentie 21 oktober 2004
10: print ‘hallo’: protected member wordt overerfd. 11: print NIETS: private member wordt niet overerfd. 12: print ‘dit is geheim’: toegang via access method van de parent. 17: Error, 18: NIETS Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: private methods
Private methods kunnen ALLEEN van binnenuit de class zelf aangeroepen worden. Elke andere denkbare aanroep resulteerd in een error. Class clsDemo { private function privateMethod() { return "private method gebruikt\n"; } function publicMethod() { echo $this->privateMethod(); } } $objDemo = new clsDemo(); echo $objDemo->privateMethod() // FAALT echo $objDemo->publicMethod() // SLAAGT
PHP Conferentie 21 oktober 2004
Class clsExtend extends clsDemo { function printOut() { return $this->privateMethod(); // FAALT bij aanroep } function printOut2() { return clsDemo::privateMethod(); // FAALT bij aanroep } function printOut3() { return $this->publicMethod(); // GOED }
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: protected methods
Protected methods kunnen alleen binnen children van de class waarbinnen ze gedefiniëerd zijn worden aangeroepen. Class clsDemo { protected function protectedMethod() { return "protected method gebruikt"; } } Class clsExtends extends clsDemo { function printOut() { return $this->protectedMethod(); } }
Goed: aanroep door child van clsDemo $objDemo = new clsExtends(); echo $objDemo->printOut();
Fout: aanroep van buitenaf. geeft errormelding. $objDemo2 = new clsDemo(); echo $objDemo2->protectedMethod();
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: abstract classes
Een abstract class is een class die slechts gedeeltelijk is ingevuld met code. Ze kunnen NIET geïnstantieerd worden maar moeten verder ingevuld worden door een extending class. abstract Class clsFrame { abstract public function sayHi(); } Class clsImplemented extends clsFrame { public function sayHi() { return "Hi there!"; } } $objTest = new clsImplemented(); echo $objTest->sayHi();
PHP Conferentie 21 oktober 2004
Fout: instantiatie van een abstract class. $objTest = new clsFrame();
Classes met 1 of meer abstract methods MOETEN zelf ook abstract gedeclareerd worden. Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: interfaces
PHP5 introduceert interfaces. Een interface is een set van lege method definitions. Classes kunnen een of meerdere interfaces implementeren. FOUT: Class clsDemo implements Class clsDemo implements itfDemo { itfDemo { public function sayHi() { public function sayHi() { niet alles van return "Hi!"; return "Hi!"; interface } } public function sayBye() { } is aanwezig. return "Bye!"; } } interface itfDemo { public function sayHi(); public function sayBye(); }
PHP Conferentie 21 oktober 2004
abstract Class clsDemo implements itfDemo { public function sayHi() { return "Hi!"; } } Class clsExtend extends clsDemo { .. ..
GOED: onvolledige class abstract declareren en later extenden. Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: constructors
PHP5 heeft uniforme constructors die niet meer de naam van de class dragen maar altijd hetzelfde heten. Nieuw in PHP5 zijn de destructors en de mogelijkheid objecten te vernietigen. Class clsDemo { function __construct() { echo "hallo wereld"; } function __destruct() { echo "vaarwel wrede wereld"; } }
Bij instantiatie wordt de constructor aangeroepen. De destructor als het script ophoudt te runnen OF bij een expliciete vernietiging: $objDemo = new clsDemo(); unset($objDemo); // sterf!! .. .. // code na de dood van .. // $objDemo
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: exception handling
Nieuw in PHP5: exceptions. Eindelijk een degelijke manier om fouten op te vangen en af te handelen. Er is een ingebouwde exception class met de volgende methods: __construct() getMessage()
constructor (argumenten: errorstring, optionele int)
retourneert error message (boven gegeven)
getCode()
retourneert de (optioneel meegegeven) errorcode
getFile()
pad naar file waarin de exception gegenereerd werd
getLine()
regelnummer waarin de exception gegenereerd werd
getTrace()
array met stack trace informatie over de fout
getTraceAsString()
PHP Conferentie 21 oktober 2004
zelfde als getTrace() maar nu als string Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: exception handling
Een exception kan in principe gemaakt worden op de standaard manier om een object aan te maken maar beter is het keyword ‘throw’ te gebruiken: $nValue = -1; if($nValue < 0) { throw new exception (”onder 0”); } .. // vervolgcode
Fatal error: Uncaught exception 'Exception' with message 'waarde onder 0' in /var/www/demo/demo.php:4 Stack trace: #0 {main} thrown in /var/www/demo/demo.php on line 4
throw forceert een Fatal error! We kunnen ervoor zorgen dat onze code bij bepaalde fouten niet door executeert ondanks dat PHP zelf geen fout ziet.
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: exception handling
In plaats van de executie te laten stoppen kunnen we ook fouten afvangen en ernaar handelen. class clsKanFoutGaan { function __construct($nArg) { if($nArg < 0) throw new exception("onder 0"); } } try { $objDitGaatFout = new clsKanFoutGaan(-1); } catch (Exception $e) { echo "het ging fout, de melding was: ".$e->getMessage(); }
We kunnen de fout dus ‘vangen’ met het catch statement. Wanneer we hem gevangen hebben kunnen we de code daarna door laten lopen. Binnen het try block wordt code NA optreden van de exception NIET meer uitgevoerd. PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: exception handling
We kunnen een onbeperkt aantal soorten fouten afvangen met try-catch constructies: class belowZeroException extends Exception {}; class aboveNineException extends Exception {}; class clsKanFoutGaan { function __construct($nArg) { if($nArg < 0) throw new belowZeroException("onder 0"); if($nArg > 9) throw new aboveNineException("boven 9"); } } try { $objDitGaatFout = new clsKanFoutGaan(-1); } catch (belowZeroException $e) { echo "het ging fout, de melding was: ".$e->getMessage(); } catch (aboveNineException $e) { echo "het ging op een andere manier fout. de melding was: ".$e->getMessage(); }
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken Zend Engine 2.0: overige nieuwe mogelijkheden
Static methods instanceOf() (check of een object een instance van een bepaalde class is) __toString() __METHOD__ constante final methods reflection API
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken
XML in PHP5
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken XML in PHP
PHP5 biedt nu drie verschillende manieren om met XML om te gaan: SAX SimpleXML
DOM
PHP Conferentie 21 oktober 2004
SAX (XML lezen/ verwerken) DOM (XML lezen, wijzigen en genereren) SimpleXML (eenvoudiger manier om XML te lezen, wijzigen en genereren, eigen PHP5 standaard) Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken W3C DOM Level 2 XML interface
XML: geen buzzword meer maar een breed geaccepteerde standaard. DOMXML in PHP 4 experimenteel en buggy PHP5 DOM interface 100% W3C DOM Level 2 compliant Performance sterk verbeterd PHP5 DOM classes kunnen door de programmeur uitgebreid worden
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken W3C DOM Level 2 XML interface
PHP DOM XML Code voorbeeld. XML maken: $aContentExample = array("Piet" => "Janssen", "Marie" => "de Boer", "Frits" => "Peters", "Carla" => "de Groot"); $objDOM = new DOMDocument(); $objRootElement = $objDOM>createElement("medewerkers"); foreach($aContentExample as $sKey => $sValue) { echo $sThisOne; $objPersoonElement = $objDOM>createElement("persoon"); $objRootElement->appendChild($objPersoonElement); $objVoornaamElement = $objDOM>createElement("voornaam"); $objVoornaamElement->appendChild($objDOM>createTextNode($sKey)); $objPersoonElement>appendChild($objVoornaamElement); $objAchternaamElement = $objDOM>createElement("achternaam"); $objAchternaamElement->appendChild($objDOM>createTextNode($sValue)); $objPersoonElement>appendChild($objAchternaamElement); } $objDOM->appendChild($objRootElement); header("content-type:text/xml"); echo $objDOM->saveXML();
PHP Conferentie 21 oktober 2004
De PHP5 DOM XML interface biedt ons de mogelijkheid op een gestructureerde en 100% object georiënteerde manier met XML documentstructuren om te gaan, zowel bij lezen, wijzigen als genereren van XML documenten. Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken W3C DOM Level 2 XML interface
Documentatie momenteel nog schaars Zend.com PHP Manual MasterClass PHP5 W3C Dom Level 2 spec documentatie ALLE Dom Level 2 classes met bijbehorende methods en members zijn in PHP5 geïmplementeerd. De W3C spec kan dus naast PHP documentatie als naslagwerk gebruikt worden!
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken W3C DOM XML : XSLT
XSLT engine geen Sablotron maar libxml2 net als het XML DOM interface XSL stylesheets als DOM objecten XSL stylesheets kunnen in memory worden vastgehouden voor hergebruik Performance verbeterd Samen met DOM XML en SimpleXML een robuuste en uitgebreide XML/XSLT engine
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken
SimpleXML
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SimpleXML: XML op zijn Simpel
SimpleXML is een nieuwe API binnen PHP5 Gebouwd op libxml2 evenals de DOM implementatie Eenvoudige representatie en manipulatie van XML documenten Representatie in de vorm van een multidimensionale structuur van arrays en objecten Makkelijk switchen tussen DOM XML en SimpleXML al naar gelang wat het handigst werkt PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SimpleXML: XML op zijn Simpel
SimpleXML is, zoals de naam doet vermoeden, simpel. Althans een stuk simpeler dan DOM XML.
De Aanslag <schrijver>Harry Mulisch Kort Amerikaans <schrijver>Jan Wolkers
$bibliotheek = simplexml_load_file('boeken.xml'); foreach ($bibliotheek->plank as $plank) { printf("Plank %s\n", $plank['id']); foreach ($plank->boek as $boek) { printf("Titel: %s\n", $boek->titel); printf("Schrijver: %s\n", $boek>schrijver); } }
Een SimpleXML object kan behandeld worden als collectie van arrays en objecten. PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SimpleXML: naar DOM XML en weer terug
SimpleXML objecten kunnen eenvoudig omgezet worden naar DOM XML en vice versa.
// van DOM XML naar SimpleXML $objSimpleXML = simplexml_import_dom($objDOMXML);
// van SimpleXML naar DOM XML $objDOMXML = new DOMDocument(); $objDOMXML->loadXML($objSimpleXML->asXML());
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken
SQLite
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SQLite
Nieuw DBMS in PHP5 zonder externe database server (bv. MySQL, Postgres, etc.) File based Zeer uitgebreide SQL mogelijkheden Goede performance Goed voor kleine tot middelgrote applicaties Aanwezig in de PHP5 core dus praktisch altijd beschikbaar in elke PHP5 omgeving. Procedurele EN OO interface PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SQLite
SQLite voorbeeldcode (procedureel) $db = sqlite_open("db.sqlite"); // insert sample data sqlite_query($db, "INSERT INTO leden (naam) VALUES ('Marco')"); sqlite_query($db, "INSERT INTO leden (naam) VALUES ('Wouter')"); $result = sqlite_query($db, "SELECT * FROM leden"); while ($row = sqlite_fetch_array($result)) { print_r($row); } sqlite_close($db);
Rows Array ( [0] => 1 [id] => 1 [1] => Marco [naam] => Marco ) Array ( [0] => 2 [id] => 2 [1] => Wouter [naam] => Wouter )
Procedurele code praktisch gelijk aan mySQL interface die we al kennen. PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SQLite
SQLite voorbeeld 2 (memory DB, OO interface) $db = new SQLiteDatabase(":memory:"); $db->query("BEGIN; CREATE TABLE leden(id INTEGER PRIMARY KEY, naam CHAR(255)); INSERT INTO foo (naam) VALUES('Marco'); INSERT INTO foo (naam) VALUES('Wouter'); COMMIT;"); $result = $db->query("SELECT * FROM leden"); while ($result->valid()) { $row = $result->current(); print_r($row); $result->next(); }
SQLite heeft een OO interface zodat het mooi aansluit bij OO projecten in PHP. We zien tevens in het voorbeeld dat ook technieken als transacties en in-memory databases geen probleem zijn voor SQLite. PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken SQLite voor- en nadelen
Makkelijk portable tussen servers (geen database benodigd) Performt zeer goed in systemen met voornamelijk read operaties. Zeer krachtige API, zowel OO als procedureel Niet geschikt voor grote applicaties met veel write operaties Niet schaalbaar (meerdere DB servers)
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg
PHP5 - Nieuwe mogelijkheden en technieken
Einde vragen?
PHP Conferentie 21 oktober 2004
Marco van Hylckama Vlieg