Snímek 1 - Phalanger - the PHP Language Compiler for .NET
Transkript
Tomáš M ato u šek Lad islav P ro šek Jan Benda M artin M alý P avel N o vák V áclav N o vák T o m áš M ato u šek , 2 3.5.2006 www.php-compiler.net Č asto klad en é o tázky • C o je lep ší, P H P n eb o .N E T ? • ch yb n ě položen á otázka PHP je jazyk .N E T je p latfo rm a p ro lib ovo ln ý jazyk • C o je lep ší, P H P n eb o C #? • opět n ekorektn í P H P je d yn am ický jazyk n em u sí se d b át n a typ y – výh od a a zároveň n evýh od a volán í fu n kcí p o m o cí jm én a, vyh od n oco ván í kód u za b ěh u , … C# je staticky typ ovan ý jazyk každ á p ro m ěn n á m u sí m ít d eklaro van ý svů j typ záleží n a ú čelu , p ro který je jazyk zvolen , p ak lze d isku tovat o vh od n osti volby “It’s th e p u rp ose, w h at d efin es u s.” p rob lém y P H P n en í jasn é, co to vlastn ě P H P je (chybí sp ecifikace, m írn ě ch ao tický d esig n ) www.php-compiler.net M ýty • .N E T Fram ew o rk je jen p ro staticky typ ovan é jazyky • P H P je in terp reto van ý jazyk, n elze kom p ilovat • .N E T Fram ew o rk je p om alý • .N E T Fram ew ork je p ou ze kom erčn í • P h alan g er d o kazu je, že n ic z toh o n ep latí! www.php-compiler.net Co je a co u m í P h alan g er? • Kompiláto r a b ěh o vé p ro střed í jazyk a P H P n a p latfo rm ě .N E T Fram ew o rk - od verze 2.0 i podpora implementace Mono • R ozšiřu je m n o žin u jazyků p latform y .N E T o P H P verze 4 a 5 - od verze 2 .0 i o n o vé p rvky jazyka P H P 6 • U m ožň u je b ěh existu jících P H P w eb ap likací v p ro střed í A S P .N E T - b ez n u tn o sti zm ěn v kó d u • Z vyšu je výkon existu jících P H P w eb ap likací • Z ajišťu je vyšší sp oleh livost w eb serveru h ostu jícíh o P H P ap likace • R ozšiřu je m o žn o sti P H P ap likací o fu n kcion alitu p latform y .N E T - u m o žň u je p sát kon zo lo vé a W in d ow s ap likace - od verze 2 .0 p řím ý p řístu p k lib o vo ln ým kn ih o vn ám p latfo rm y .N E T • Z p řístu p ň u je zko m p ilovan é P H P fu n kce a tříd y ostatn ím .N E T jazyků m • N ab ízí m o žn o st vyu žití tém ěř všech P H P kn ih o ven v lib ovoln ém jazyku p latform y • Integruje jazyk PHP do Visual Studia .NET - od verze 2.0 i do Visual Studia 2005 www.php-compiler.net S ro vn án í výko n u (IIS 5 .1 ) MSDE 2000 SP3 MySQL 4.1.11 14 d o ta zů za se ku n d u 12 10 8 6 4 2 0 Phalanger 1.0 PHP + Zend Optimizer PHP www.php-compiler.net S ro vn án í výko n u (A p ach e 2 .0 .5 4 ) MSDE 2000 SP3 MySQL 4.1.11 14 d o ta zů za se ku n d u 12 10 8 6 4 2 0 Phalanger 1.0 PHP + Zend Optimizer PHP www.php-compiler.net Z výšen í výko n u • p ou žití P h alan g eru význ am n ě zvýší výkon w eb ap likace • m ěřen o n a ap likaci p h p B B 2 .0 .1 3 (d isku sn í fóru m ) parametry benchmarku hardware: Intel Pentium M 1,4GHz, 1GB RAM platforma: Windows XP Professional SP2 web servery: IIS 5.1, Apache 2.0.54 db servery: MSDE 2000 SP3, MySQL 4.1.11 Phalanger 1.0 Beta 3, PHP 5.0.4, PHP 4.3.11 • n ejvýkon n ější m ěřen á P H P kon fig u race zdarma: Apache, MySQL, PHP 4.3.11 $960/rok: Apache, MySQL, PHP 4.3.11, Zend Optimizer 4,93 req/s 7,28 req/s • n ejvýkon n ější P h alan g er kon fig u race Apache (mod_aspdotnet), MSDE, Managed MSSQL 12,21 req/s • závěr p ou žití P h alan g eru u rych lilo p h p B B o 6 7 % resp . o 1 4 8 % • p ro sto r p ro další zvyšován í výko n u • vyšší výkon s každ ou n ovou verzí .N E T Fram ew orku vyu žití n eu stáléh o vylep šo ván í JIT teru , C LR , A S P .N E T • d alší op tim alizace ve P h alan g eru www.php-compiler.net Obsah • P řed staven í systém u P h alan g er • M o žn o sti ap likací založen ých n a P h alan g eru • ko n zolové a W in d ow s ap likace • web aplikace – integrace do ASP.NET • konfigurace • Phalanger Class Library • im p lem en tace P H P fu n kcí v C # • ro zšiřiteln ost kn ih ovn y • Z p řístu p n ěn í P H P E xten sion s .N E T ap likacím • vyu žití existu jícíh o n ativn íh o kó d u v m an ag ed ap likaci • Kompilace jazyka PHP • skripty jako jednotky kompilace • p ro m ěn n é a fu n kce • ob jektově orien tovan é rysy jazyka • Verze 2.0 • ro zšířen í P H P n a p ln o h o d n otn ý jazyk p latfo rm y .N E T (P H P /C LR ) www.php-compiler.net S o u části systém u P h alan g er • Phalanger Core • kom p ilátor lexikáln í a syn taktická an alýza vyu žito nástro jů C sLex a G P P G (generáto ry lexeru a p arseru p ro C #) g en erátor IL kód u Reflection.Emit kó d je g en ero ván d o sou b o rů n eb o jen d o p am ěti • p rostřed í p ro b ěh P H P ap likací m etod y volan é zkom p ilo van ým kód em integrace s ASP.NET serverem • Phalanger Class Library • P H P fu n kce a tříd y im p lem en tovan é v C # • p řes 5 0 0 PHP fu n kcí op erace s p oli, řetězci, reg u lárn ím i výrazy, fu n kce p ro p ráci s d atab ází M S S Q L, … • Extension Manager • m od u l u m ožň u jící volat P H P fu n kce im p lem en tovan é v P H P exten sion s • Integrace do VS.NET 2003 a 2005 • n ový typ p rojektu , zvýrazň ován í, kon trola syn taxe, … www.php-compiler.net M o žn o sti pou žití • Web aplikace v PHP • ko n fig u race pom ocí so u b o rů W eb .con fig • p o d p ora p ro rů zn é styly vývo je ap likace stan d ard n í vývoj P H P ap likací ap likace = m n o žin a skrip tů ve virtu áln ím ad resáři n a w eb serveru „p lo ch ý“ m od el (lin ear m od el) edit-save-refresh skrip ty se kom p ilu jí au tom aticky, p rog ram átor se kom p ilací n em u sí zab ývat ASP.NET web aplikace (Phalanger 2.0) ap likace je stru ktu rovan á, tvořen á z ko m p on en t, d esig n ery část P H P kód u g en erován a n a základ ě X M L sou b o rů exp licitn í kom p ilace a d ep loym en t • K on zo lo vé a W in d o w s ap likace v P H P • výsled ek kom p ilace je .exe sou b o r (assem b ly) • ko n fig u race pom ocí .exe.con fig sou b o rů www.php-compiler.net Web aplikace – p lo ch ý m o d el • skrip ty v d an ém virtu áln ím ad resáři n astaven ém jako w eb ap likace • ko n fig u race virtu áln íh o ad resáře v IIS • stejn á jako p ro jin é A S P .N E T ap likace • p říp on a .p h p m ap ován a n a IS A P I m od u l A S P .N E T v1 .1 c:\windows\microsoft.net\framework\v1.1.4322\aspnet_isapi.dll • d otaz od klien ta je z IIS p řep oslán A S P .N E T w orker p rocessu • konfigurace ASP.NET • n astaven a p ři in stalaci P h alan g eru v M ach in e.con fig • p řid án a p o ložka d o sezn am u H T T P h an d lerů • zajišťu je p řed án í d otazu tříd ě im p lem en tovan é v P h alan g er C ore <system.web> <httpHandlers> <add verb="*" path="*.php" type="PHP.Core.PageFactory, PhpNetCore, Version=1.0.0.0,..."/> <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory" /> ... <add verb="*" path="*" type="System.Web.HttpMethodNotAllowedHandler" /> </httpHandlers> </system.web> www.php-compiler.net R o zh ran í p ro sp o lu p ráci s A S P .N E T • ro zh ran í IHttpHandler • tříd a im p lem en tu jící toto ro zh ran í zp racovává d o tazy a g en eru je strán ky • vyvo lán a p ři p řijetí d otazu p oslan éh o d o w o rker p ro cessu z IS A P I m o d u lu • vyko n áván a jed n ím vlákn em , které d ostalo n a starosti zp raco ván í d o tazu • p racu je v kon textu p řip raven ém v A S P .N E T • zjistí, zda d otazovan ý skrip t již b yl zko m p ilo ván • tj. zd a assem b ly je u ložen a v cach e n a d isku • není zavolá kom p ilátor, který tu to assem b ly vytvoří • n ačte assem bly d o p am ěti • sp u stí g lob áln í kód skrip tu www.php-compiler.net K o n fig u race P H P w eb ap likací • P H P d efin u je kon fig u raci n a n ěko lika ú ro vn ích • soubor php.ini • sou b ory .h taccess v ad resářích (jen A p ach e server) • zm ěn a n astaven í b ěh em b ěh u skrip tu (fu n kcem i in i_ g et, in i_ set, ...) n ěkteré volb y takto n elze m od ifiko vat • Phalanger • • • • • vyu žívá h ierarch ickou kon fig u raci A S P .N E T (W eb .con fig , M ach in e.con fig ) kon fig u race u ložen á p o n ačten í z X M L v kon fig u račn ích ob jektech m ap u je h od n oty v kon fig u račn ích ob jektech n a orig in áln í n astaven í P H P m ožn ost zakázat zm ěn u h od n oty v sou b orech n a n ižší ú rovn i kon fig u račn í ob jekty • ap likačn í kon fig u race p latn á p ro všech n y d o tazy d o ap likace n elze m od ifiko vat v p od ad resářích ap likace • g lob áln í ob sah u je kon fig u raci p latn ou p ro všech n y d o tazy d o d an éh o ad resáře • lokáln í kon fig u race m ěn iteln á za b ěh u aso ciovan á s d o tazem www.php-compiler.net K o n fig u račn í sekce • d efin ice sp ecifické kon fig u račn í sekce • p ři in stalaci je p řid án zázn am d o M ach in e.co n fig • sp ecifikován a tříd a m ající n a starost p arsován í sekce implementuje IConfigurationSectionHandler <configuration> <configSections> <section name="phpNet" type="PHP.Core.ConfigurationSectionHandler,…"/> </configSections> </configuration> www.php-compiler.net P říklad ko n fig u račn íh o so u b o ru <configuration> <phpNet> <!-- Seznam knihoven (assemblies), které jsou použity v aplikaci --> <classLibrary> <add assembly="PhpNetClassLibrary,…" section="bcl"/> <add assembly="PhpNetMsSql,…" section="mssql" /> <add assembly="php_sockets.mng,…" section="sockets" /> </classLibrary> <!–- Nastavení Session Handleru --> <session-control> <set name="AutoStart" value="false" phpName="session.auto_start" /> <set name="Handler" value="aspnet" /> </session-control> A trib u t p h p N a m e slo u ží je n p ro le p ší o rie n ta ci u živa te lů zn a lých ko n fig u ra ce P H P (p ři p a rso vá n í je ig n o ro vá n ) H o d n o tu to h o to n a sta ve n í již n e p ů jd e zm ě n it v so u b o re ch n ižší ú ro vn ě . <!–- Nastavení Phalanger Base Class Library --> <bcl> <mailer> <set name="SmtpServer" value="localhost" phpName="SMTP" allowOverride="false" /> <set name="SmtpPort" value="25" phpName="smtp_port" /> <set name="DefaultFromHeader" value="[email protected]" phpName="sendmail_from" /> </mailer> <highlighting> <set name="Background" value="white" phpName="highlight.bg" /> <set name="String" value="navy" phpName="highlight.string" /> </highlighting> </bcl> <!–- Nastavení PHP extension "sockets" --> <sockets> <set name="sockets.use_system_read" value="On" /> </sockets> </phpNet> </configuration> www.php-compiler.net Z p raco ván í h ierarch ické ko n fig u race • • • • A S P .N E T zp racovává sou b ory W eb .con fig n ach ázející se p od él cesty d otazu kon fig u račn í h an d ler je vo lán p ro každ ý zp racovávan ý sou b or h an d ler vrací kon fig u račn í ob jekt zp racovávan éh o sou b oru výsled ek je u lo žen d o cach e d o h an d leru je p řed án kon fig u račn í ob jekt asociovan ý s n ad řazen ým sou b orem <phpNet> <set a=1> </phpNet> a=1 b=0 c=0 /App/Web.config <phpNet> <set b=2> </phpNet> a=1 b=2 c=0 /App/A/Web.config <phpNet> <set c=3> </phpNet> a=1 b=2 c=3 ko n fig u ra čn í o b je kty v ca ch e A S P .N E T • /Web.config /App/B/Web.config <phpNet> <set c=4> </phpNet> ko n fig u ra čn í o b je kty p o d o ta ze ch GET /App/A/file.php www.php-compiler.net Z p raco ván í h ierarch ické ko n fig u race • • • • <phpNet> <set a=1> </phpNet> a=1 b=0 c=0 /App/Web.config <phpNet> <set b=2> </phpNet> a=1 b=2 c=0 /App/A/Web.config <phpNet> <set c=3> </phpNet> a=1 b=2 c=3 clone • A S P .N E T zp racovává sou b ory W eb .con fig n ach ázející se p od él cesty d otazu kon fig u račn í h an d ler je vo lán p ro každ ý zp racovávan ý sou b or h an d ler vrací kon fig u račn í ob jekt zp racovávan éh o sou b oru výsled ek je u lo žen d o cach e d o h an d leru je p řed án kon fig u račn í ob jekt asociovan ý s n ad řazen ým sou b orem /Web.config /App/B/Web.config <phpNet> <set c=4> </phpNet> a=1 b=2 c=4 ko n fig u ra čn í o b je kty p o d o ta ze ch GET /App/A/file.php GET /App/B/file.php www.php-compiler.net Phalanger Class Library • im p lem en tace fu n kcí a tříd p ou žiteln ých v P H P acosh addcslashes array_chunk array_combine array_count_values array_diff array_fill array_filter array_flip array_key_exists array_keys array_map array_merge array_multisort array_pad array_pop array_push array_rand array_reduce array_reverse array_search array_shift array_slice array_splice array_sum array_unique array_unshift array_values arsort asin base64_decode base64_encode base_convert basename bin2hex bin2hex_unicode • v lib o voln ém jazyce p od p oru jícím typ o vý systém .N E T u a cu stom attributes • sada knihoven (assemblies) • Base Class Library základ n í kn ih ovn a fu n kce p ro p ráci s p oli, řetězci, … • native extension obalena tzv. managed wrapperem g en erovan ým au tom aticky (viz d ále) ob sah u je m an ag ed stu b y volající n ativn í kód n aven ek se ch ová stejn ě jako ostatn í kn ih ovn y • managed extension reimplementace PHP extension v managed jazyku tran sp aren tn ě n ah razu je n ativn í exten sion rych lejší n ež p ou žití n ativn í im p lem en tace • u živatelské kn ih ovn y p ři d o d ržen í jistých p ravid el lze jed n od u še p řid at vlastn í fu n kcion alitu www.php-compiler.net Deskriptor knihovny • popisuje vlastnosti knihovny • jm én o kn ih ovn y • sezn am P H P exten sion s im p lem en tovan ých kn ih ovn ou • d efin u je ch ován í kn ih ovn y • p ři jejím n ačtěn í m o žn ost reg istro vat n ové session h an d lery, serializery ap od . • p ři n ačítán í její kon fig u račn í sekce p arso ván í sekce vytvářen í vlastn ích kon fig u račn ích ob jektů • tříd a d eskrip toru • jed n a tříd a m ů že b ýt d eskrip torem i p ro více kn ih oven n ap ř. n ative exten sion s m ají jed n u tříd u d eskrip toru • instance deskriptoru • p ro každ ou n ačten ou kn ih ovn u je vytvořen a p rávě jed n a in stan ce d eskrip toru www.php-compiler.net Obsah knihoven • implementace • PHP konstant literáln í field y o zn ačen é atrib u tem [Im p lem en tsC on stan t] • P H P fu n kcí statické m etod y ozn ačen é atrib u tem [Im p lem en tsFu n ction ] • P H P tříd a rozh ran í tříd y zd ěd ěn é (n ěp řím o) od tříd y P h p O b ject rozh ran í ob sah u jící IP h p In terface označen í atrib u tem [ImplementsType] • om ezen í klad en é n a im p lem en tace • sig n atu ry fu n kcí m u sí obsah ovat jen typy d ostu p n é PH P • P H P tříd y m u sí m ít n ěkteré sp ecifické vlastn osti • a d alší … www.php-compiler.net A d ap tace vo lacích ko n ven cí • jazyk P H P m á jin é kon ven ce volán í n ež .N E T • • • • p řed áván í p aram etrů ko p ií ko n verze typ ů variab iln í p očet aktu áln ích p aram etrů ... • cíl n ávrh u kn ih o ven • odstín it co n ejvíce vlastn í fu n kcion alitu od specifických vlastn ostí jazyka PHP • m o žn ost p ou žívat „p o h o d ln ě“ kn ih o vn í fu n kce i z jin ých jazyků • u m o žn it co n ejobecn ější im p lem en tace • ko m p iláto r o b alu je volán í kn ih ovn í fu n kce v P H P kód u • řízen o atrib u ty d efin o van ým i v C o re n ap ř. [P h p D eep C op y], [C astT oFalse], … www.php-compiler.net Extensions • PHP • m n o h o fu n kcí a tříd im p lem en to ván o v tzv. P H P exten sio n s php_gtk.dll php_imap.dll php_oci8.dll php_pdf.dll php_sockets.dll … • Phalanger • m o žn ost vyu žít fu n kcio n alitu v exten sio n s z lib o vo ln é .N E T ap likace managed wrappers m ají stejn é ro zh ran í jako C lass Lib raries managed reimplementace knihovny php4ts.dll n astaviteln á ú roveň izolace m o žn ost h o sto vat n ativn í exten sio n s v od d ělen ém p rocesu www.php-compiler.net Managed wrappers assem b lies gen erovan é au to m aticky z n ativn ích exten sio n s a typ ových in fo rm ací ve form átu X M L • php_sockets.dll ... PHP_FUNCTION(socket_write) { zend_parse_parameters(...); ZEND_FETCH_RESOURCE(...); // ... RETURN_LONG(...); } ... php_sockets.xml ... <function returnType="int" name="socket_write" > <param type="resource" name="socket" /> <param type="string" name="buf" /> <param optional="true" type="int" name="length" /> </function> ... php_sockets.mng.dll .method public hidebysig static int32 socket_write( class [PhpNetCore]PHP.Core.PhpResource socket, string buf, int32 length) cil managed { .custom instance void PhpNetCore]PHP.Core.ImplementsFunctionAttribute ... // ... call object [PhpNetCore]PHP.Core.Externals::InvokeFunction(...) // ... ret } .method public hidebysig static int32 socket_write( class [PhpNetCore]PHP.Core.PhpResource socket, string buf) cil managed { .custom instance void PhpNetCore]PHP.Core.ImplementsFunctionAttribute ... // ... call object [PhpNetCore]PHP.Core.Externals::InvokeFunction(...) // ... ret } www.php-compiler.net php4ts.dll základ n í sou část P H P in terp retu • exp o rtu je ~ 800 sym bolů • • b ěh ová p od p ora p ro exten sion s – Zend API • reim p lem en tován a jako m ixed -m ode assem b ly s p ou žitím C + + /C LI • C + + /C LI g en eru je IL i n ativn í kód p om o ci # p rag m a m an ag ed , # p rag m a u n m an ag ed lze p řep ín at n a ú rovn i fu n kcí i fu n kce p řeložen é d o IL m oh ou p raco vat s u n m an ag ed d aty o b d o b a klíčo véh o slo va u n safe v C # jen m alá režie p ři volán í u n m an ag ed z m an ag ed a n aop ak • ad ap tačn í vrstva m ezi m an ag ed světem P h alan g eru a u n m an ag ed světem PHP extensions PHP extension 1 Phalanger Core managed API php4ts.dll Zend API PHP extension 2 … www.php-compiler.net P o d p o ro van á fu n kcio n alita • vo lán í fu n kcí im p lem en tovan ých v exten sion s • ve w rap p erech rep rezen to ván y statickým i m eto d am i • p ou žíván í tříd im p lem en tovan ých v exten sion s • do wrapperů n agen erován y m an ag ed verze tříd • p o d p ora „m ag ických “ m eto d (__ g et, _ _set, _ _ call, … ) • b in d in g p aram etrů • d lo u h odobé svázán í p ro m ěn n é ve skrip tu s její n ativn í rep rezen tací u vn itř exten sion • n ap ř. oci_bind_by_name & oci_execute • zp ětn á vo lán í z exten sion s d o skrip tu www.php-compiler.net Izolace extensions • exten sio n s je m o žn é izolovat v od d ělen ém p rocesu • vh o d n é zejm én a p ro w eb ap likace, kd e b y n ed ů věryh o d n ý n ativn í kó d o h ro žoval b ezp ečn ost a stab ilitu w eb serveru • n astavu je se p ro každ o u exten sio n zvlášť atribut isolated v kon fig u račn ím sou b oru • izolo van é exten sion s h ostován y v p ro cesu E xtM an ag er au tom aticky sp ou štěn , p oku d n eb ěží • komunikace mezi Phalanger Core a procesem ExtManager vyu žívá in frastru ktu ru .N E T R em otin g • každ é volán í fu n kce n eb o m eto d y im p lem en to van é v exten sio n zn am en á m ezip rocesovou kom u n ikaci • výrazn é sn ížen í výko n u n u tn á serizalizace p aram etrů režie sp ojen á s kom u n ikací, syn ch ron izací, … www.php-compiler.net Kompilace jazyka PHP • podpora verze 6 se zp ětn ou kom p atib ilitou s verzemi 4 a 5 • volba v konfiguraci • h lavn í p rob lém jazyka P H P – ch yb ějící sp ecifikace • n ěkteré kon stru kce jazyka n ejsou zcela jed n o zn ačn ě d efin o ván y b ylo třeb a p rozkou m at, jak se ch ová P H P in terp ret • kó d sp oléh ající se n a ch yb y v P H P in terp retu n en í p od p o ro ván • n ěkteré kon stru kce jsou p oklád án y za ch yb n é a n ejsou p o vo len y n ap ř. vícen ásob n é p ou žití form áln íh o arg u m en tu fu n kce function f($a, $a) { … } • n ep o d porován y kon stru kce d o ku m en tovan é P H P jako d ep recated n ap ř. p ou žití m od ifikátoru & n a aktu áln í arg u m en ty f(&$a); se chová stejn ě jako f($ a); kom p ilátor h lásí varován í, p oku d je tak n astaven o v kon fig u raci www.php-compiler.net K o m p ilace skrip tů • standard mode • ko m p ilace p rob íh á postu p n ě p o skrip tech • inkluze statické – op tim alizace, p oku d je kom p ilátor sch op en n ajít cíl d yn am ické – cíl je n alezen (a zp říp ad n ě zkom p ilován ) až za b ěh u ap likace • výsled ek kom p ilace skrip tu web aplikace jed en skrip t od p o víd á jed n é assem b ly m o žn ost zko m p ilo vat všech n y skrip ty d o jed n é assem b ly a d istrib u o vat ap likaci b ez zd rojo véh o kód u ostatn í ap likace všech n y skrip ty ap likace jsou kom p ilo ván y d o jed n é assem b ly p řid án en try-point aplikace • pure mode (verze 2.0) • zakázán y in klu ze a g lo b áln í kó d , p o vo len y jen g lob áln í d eklarace • všech n y d eklarace jsou vid ět g lo b áln ě ve všech skrip tech (jako v C #) www.php-compiler.net K o m p ilace kó d u skrip tu • obsah skriptu • deklarace funkcí, tříd n eb o ro zh ran í • g lo b áln íkód kód vn ě deklarací text vn ě skrip tovacích závo rek < ? ?> , < ?p h p ?> , < % % > , … zkon verto ván n a volán í echo() • výsled ek ko m p ilace • g lo b áln í kód + d eklarace fu n kcí statická tříd a Default (non-pure) PHP funkce statické m etod y stejn éh o jm én a g lob áln í kód h lavn í statická m etod a M ain () • P H P tříd a .N E T tříd a d ěd ičn ost zach ován a, základ n í tříd a je P h p O b ject • p o m o cn é m etod y Run apod. www.php-compiler.net Kontext skriptu • m n o žin a ob jektů asociovan ých s b ěžícím skrip tem • in stan ce tříd y P H P .C ore.S crip tC on text • vznik kontextu • PHP web aplikace – n a začátku zp racován í d otazu • kon zolové a W in d ow s P H P ap likace – p ři sp u štěn í • ostatn í ap likace (n ap san é v jin ém jazyce) – m an u áln ě • p řed áván í kon textu • p aram etr každ é u živatelské P H P fu n kce • p aram etr kon stru ktoru každ é u živatelské P H P tříd y • ostatn í kód (n ep san ý v P H P ) kon text skrip tu je u m ístěn v call-con textu aktu áln íh o log ickéh o vlákn a • obsah kontextu • lokáln í kon fig u račn í ob jekt • tab u lka g lo b áln ích p rom ěn n ých • tab u lka d eklaro van ých u živatelských P H P fu n kcí, tříd a rozh ran í • a d alší … www.php-compiler.net D eklarace fu n kcí, tříd , ro zh ran í • PHP • n eu m ožň u je zru šit an i p řep sat již d eklaro van o u en titu • u m o žň u je p od m ín ěn o u d eklaraci if (podmínka) { function f(…) { … } } else { function f(…) { … } } if (podmínka) { class C { … } } else { class C { … } } • Phalanger • každ á z deklarací je zko m p ilo ván a zvlášť jm én a statických m etod jsou p ozm ěn ěn a (n ap ř. f#0, f#1) • lo káln í tab u lka d eklaro van ých typ ů a fu n kcí (n a ko n texto vém ob jektu ) v okam žiku d eklarace je p řid án d eleg át d o tab u lky d eklarovan ých fu n kcí resp . type-ob ject d o tab u lky d eklaro van ých tříd a rozh ran í v okam žiku p ou žití je v tab u lce n alezen a p říslu šn á en tita • globáln í tab u lka typ ů a fu n kcí n ačítan á p om ocí reflexe p ou žitých kn ih oven n ěkolik fází n ačítán í n en ačítají se n ajed n ou všech n y typ y, m etod y a fu n kce m n oh é n eb u d ou p o třeb a www.php-compiler.net P ro m ěn n é • PHP • d yn am icky typ ovan é v kód u n en í sp ecifikován typ p rom ěn n é p rom ěn n á m á typ p od le p osled n í op erace n a n í p roved en é • typ y p rom ěn n ých bool, int, double, string, array, resource, null u živatelské typ y – tříd y, rozh ran í • p ro m ěn n é m oh ou m ít alias m od ifikátor & (n ap ř. $ a = & $ b , fu n ction f(& $ a) {}, … ) • Phalanger • statické typ y S ystem .O b ject (p rom ěn n á b ez aliasu ) C ore.P h p R eferen ce (p rom ěn n á s aliasem ) • d yn am ické typ y Boolean, Int32, Double, String, Core.PhpArray, Core.PhpResource Core.PhpObject sp olečn á n ad tříd a p ro u živatelské P H P tříd y, které n ed ěd í z .N E T tříd y www.php-compiler.net U lo žen í p ro m ěn n ých • g lo b áln í p rom ěn n é • tabulka na kontextu skriptu • lokáln í p rom ěn n é • op tim alizovan á fu n kce p rom ěn n é zn ám é za p řeklad u stan d ard n í lo káln í p ro m ěn n é n a záso b n íku p rom ěn n é vzn ikající za b ěh u lo káln í tab u lka ru n -tim e p ro m ěn n ých • n eop tim alizovan á fu n kce lo káln í tab u lka všech p rom ěn n ých • lokáln í tab u lky p rom ěn n ých • m ap u jí jm én a n a h od n oty • vzn ikající až kd yž je to op ravd u n ezb ytn é • funkci lze optimalizovat, neobsahuje-li • d yn am ický kód (n evím e, jak se ch ová k p rom ěn n ým ) • kód p oten ciáln ě vyžad u jící tab u lku všech p rom ěn n ých www.php-compiler.net O b jekto vý m o d el • PHP 5 • vícen áso b n á d ěd ičn ost rozh ran í • jed n on áso b n á d ěd ičn ost tříd • public, protected, private, static, abstract, final • m o žn o st p řid ávat field y d o in stan cí za b ěh u • „m ag ické“ m etod y __construct __destruct __get __set __call __sleep __wakeup __clone – – – – – – – – ko n stru kto r, ale d ěd í se destruktor vyvo lán a p ři čten í n eexistu jícíh o field u vyvo lán a p ři záp isu d o n eexistu jícíh o field u vyvo lán a p ři vo lán í n eexistu jící m eto d y vyvo lán a p řed serializací o b jektu vyvo lán a p o d eserializaci o b jektu ko p íro ván í o b jektu www.php-compiler.net O b jekto vý m o d el • Phalanger • p o d p oru je tém ěř celý o b jekto vý m o d el P H P 5 _ _ d estru ct fu n g u je s jin ou sém an tikou n a .N E T u n en í d eterm in istická fin alizace ob jekty u klizen y p ři skon čen í zp raco ván í d otazu • ko m p ilu je P H P tříd y a ro zh ran í d o .N E T tříd a ro zh ran í zach ovává h ierarch ii d ěd ěn í je m ožn é d ěd it i od .N E T tříd d rob n á o m ezen í • in stan cím .N E T tříd lze v P H P také p řid ávat field y za b ěh u cíl: co n ejm en ší rozd íl m ezi .N E T tříd am i a P H P tříd am i www.php-compiler.net P ro b lém y • n ěkteré kom b in ace atrib u tů n ejso u v .N E T p ovolen y • abstract static, final static • řešen í p om ocí cu stom atrib u tů [PhpAbstract], [PhpFinal] • bázová tříd a n eb o rozh ran í n em u sí b ýt za kom p ilace zn ám á • o d lo žen í kom p ilace n a d o b u b ěh u class A extends B { /* … */ } eval(‘class A extends B { /* … */ }’); • každ ý w eb o vý d otaz m u sí m ít svoji kop ii statických field ů • statické field y op atřen y atrib u tem [ThreadStatic] • lín á inicializace p řed p rvn ím p řístu p em • tříd a m ů že zvýšit vid iteln ost zd ěd ěn éh o field u z p rotected n a public • tříd a op atřen a cu stom atrib u tem [PhpPublicField("jm én o_ field u ")] www.php-compiler.net N evirtu áln í p řístu p • p řeklad kon stru kcí A ::c, A ::$x, A ::f() • tříd a A je zn ám á v d o b ě kom p ilace p řím ý p řístu p • tříd a A n en í zn ám á v d o b ě ko m p ilace m ělo b y stávat sp íš jen ojed in ěle kom p ilátor vyem itu je volán í o p erátoru , který n ajd e typ A v tab u lkách (lo káln í a g lob áln í) najde field/metodu v tabulce pro typ A p om alejší • ob jekto vé o p eráto ry d ostávají jako p aram etr typ ový kon text • u rču je typ , v jeh ož kon textu se m á o p erace p ro vést • u m o žň u je operátoru p ro vést ko n tro lu p řístu p u (vid iteln osti) vyn u cen í p ravid el p ro p rotected a p rivate člen y www.php-compiler.net V irtu áln í p řístu p • p řeklad kon stru kcí $a->x, $a->f() • ob ecn ě n en í m ožn é u rčit typ $ a v d ob ě kom p ilace m o žn ost statické an alýzy, ale n e vžd y d ává výsled ek • em itu je se volán í op erátoru , který z in stan ce získá referen ci n a typ n a typ u n ajd e field /m etod u v tab u lce za kom p ilace zn ám ých field ů /m etod p o ku d field n en alezen , p ak h led á v tab u lce ru n -tim e field ů tab u lka aso cio van á s in stan cí • op tim alizace ko n stru kcí $ th is->x, $this->f() typ $ th is b ývá v d ob ě kom p ilace zn ám ý class A { public $x = "foo"; public function dump() { echo $this->x; } }; class B extends A { public function __get($a) { return "bar"; } } $a = new B; unset($a->x); $a->dump(); www.php-compiler.net Namespaces • n u tn é kvů li p řístu p u n a .N E T kn ih ovn y • zatím n ejsou im p lem en to ván y v P H P je k d isp o zici jen n ávrh a p o ku sn á im p lem en tace (p atch ) • Phalanger p o d p oru je tém ěř ú p ln ě n ávrh au to rů P H P • syn tax jm én a • • • deklarace • • od d ělovač - šesti-tečka ::: p ř. S ystem :::W in d ow s:::Form s:::Form namespace My:::Namespace { class T rid a { … } fu n ction Fu n kce { … } } im p ortován í sym b olů • • svázán o se sou b orem (jako v jazycích C #, Java, … ) syntax: import namespace System; import class System:::Windows:::Forms:::Form as F; import function My:::Namespace:::Funkce as f; www.php-compiler.net PHP/CLR • rozšířen í P H P o syn taxi p o třeb n o u • p ro p ráci s .N E T tříd am i • p ro u m ožn ěn í p ln é in teg race s kom p on en tovým p řístu p em A S P .N E T • zm ěn y • v duchu jazyka • jed n od u ch á syn tax, co n ejm én ě om ezen í • co n ejvíce d yn am ičn osti (n ech cem e yet an oth er V B ) • ro zšířen í • g en erické typ y a m etod y • custom attributes • getters, setters • p arciáln í tříd y • vyn u cen é volán í kon stru ktoru n ad tříd y • lib ovoln é id en tifikátory (b ez om ezen í klíčových slov) • LINQ www.php-compiler.net PHP/CLR: Generika • d ů vod • • sp ecifikace g en erických arg u m en tů p ři p ou žíván í .N E T tříd gramatika p řid án y n o vé token y <:, :> • nutnost pro zachován í zp ětn é ko m p atib ility • p ř. f(m < A, B > (C)); • deklarace generických typ ů a funkcí • p ř: import namespace System:::Collections:::Generic; class MyDict<:K, V:> extends Dictionary<:K, V:> { … } function f<:K:> { … } • defaultní h od n oty typ ových p aram etrů class MyDict<:K = object, V = object:> extends Dictionary<:K, V:> {…} • p ou žití g en erických typ ů • p ř. $t = "MyDict"; $k = "int"; $v = "List"; new MyDict(); // instanciace MyDict<:object,object:> new MyDict<:int:>(); // instanciace MyDict<:int, object:> new $t<:$k,$v<:int:>:>; // instanciace MyDict<:int, List<:int:>:> function f<:K:> { return new MyDict<:K,K:>(); } www.php-compiler.net PHP/CLR: Custom Attributes • d ů vo d • n ěkteré .N E T ap likace vyžad u jí atrib u ty p ř.: W eb services – [W eb M eth o d ] o zn aču je m eto d u slu žb y • výh od n é i p ro jin é ú čely statické P H P field y m u sí m ít sém an tiku th read -static jak v P H P /C LR ap likaci n ad eklaro vat sku tečn ý statický field ? atribut [AppStatic] • syntaxe • stejná jako v C # class C extends System:::Web:::Services:::WebService { [AppStatic] private static $x; [WebMethod(Description = "Foo", EnableSession = false)] public function GetFoo() { … } } www.php-compiler.net PHP/CLR: Getters, Setters • d ů vo d • p řep sán í zd ěd ěn ých .N E T p rop erties .N E T p roperty a field jso u z h led iska P H P to též • syntax import namespace System:::Windows:::Forms; class MyForm extends Form { protected $DefaultSize { function __get() { return new Size(10, 10); } } } www.php-compiler.net PHP/CLR: Language INtegrated Query • zob ecn ěn í foreach cyklu • g en erátory d at, filtry, p ro jekce, tříd iče, … C# 3.0: var result = from c in customers where c.City == "London" from o in c.Orders where o.OrderDate.Year == 2005 select new {c.Name, o.OrderID, o.Total} • d ů vo d • b ýt „in “ • mů že zp řeh led n it p rog ram , zo b ecn it p řístu p k d atů m • syntax PHP/CLR: $result = from $customers as $c where $c->City == "London" from $c->Orders as $o where $o->OrderDate->Year == 2005 select array($c->Name, $o->OrderID, $o->Total) www.php-compiler.net
Podobné dokumenty
Implementace LMS MOODLE na Windows 2003 Server a IIS 6.0
stránkách http://dev.mysql.com/downloads/ zvolíme MySQL Community Server a stiskneme tlačítko Download. Z části Windows Downloads vybereme a stáhneme balíče zip archiv
VícePředmět CASE: Enterprise Architecture
Strategické „směřování“, zahrnující vizi, principy, cíle a úkoly vedoucí k vývoji a charakteru cílové architektury systému Současná a cílová architektura, reprezentující současné (a cílové) sch...
VíceCETIS 32
D o to h o to n o vě vy tvo ře n é h o ad re s á ře b u d e m e u k lá d at s vé z á z n am y . P ro s n az š í o rie n tac i s e z á z n am y v ad re s á ři u k lá d ají d o tz v. o b je k tů , o ...
VíceGD1- GD10 - TECHNOPARK.CZ
Zařízení GD1 a GD10 se může skládat z příslušenství, které je znázorněno na Obrázku 2, ihned zkontrolujte, jestli obsah Vašeho balení odpovídá tomuto obrázku a dále zkontrolujte, jestli jsou jednot...
Více001 titulka.indd - Regionální hospodářská komora Plzeňského kraje
jejímž vývozem se zabýváme, zatím trvá. Jen za rok 2007 jsme získali dvacítku dalších destinací pro export,“ říká finanční ředitelka firmy Andrew
Vícepolyfunkční a sportovní stavby
globální politiku Glopolis, bylo oceněno osm tuzemských firem za technologická řešení v environmentální oblasti, jež by se dala využít v zemích třetího světa. Č e s t n é o c e n ě ní b y l o u d ě...
Více