SlideShare ist ein Scribd-Unternehmen logo
Wer nutzt die PHP-Reflection API? Und für was?
Fragen können jederzeit gestellt werden
Metaprogrammierung und Reflection Tool-Entwicklung für und mit PHP Stefan Marr  PHP Unconference 26./27. April 2008
Begriffsklärung Open Implementations Metaprogrammierung und Frameworkdesign Relevante Sprachfeatures von PHP Reflection und Runkit für die Tool-Entwicklung Zusammenfassung Agenda
METAPROGRAMMIERUNG UND REFLECTION Kurze Begriffsklärung zur Einleitung
Verarbeitendes System Daten repräsentieren Domäne Programm beschreibt Veränderungen Interpreter führt Programm aus Domäne Buchhaltung, Kundendaten, Logistik, Webinhalte, … nach [1]
Kausal verbundenes System Ursache-Wirkungsbeziehung zwischen System und Domäne Direkte wechselseitige Auswirkungen Regellungstechnik Klimaanlagen Autopiloten … nach [1]
Meta-System Spezielle Domäne: Programme Meta-Programme und -system arbeiten auf Basis-Programmen und -systemen Compiler Code-Transformation, Generierung … nach [1]
Reflektives System Spezielle Meta-Systeme Selbstrepräsentation bestimmter Strukturen Kausal verbunden Reflektives Verhalten Introspection (beobachten) Intercession (Selbstveränderung) nach [1]
Meta- und Reflektive Systeme Kausal verbunden Meta-System Reflektiv nach [1]
OPEN IMPLEMENTATIONS Metaprogrammierung und Moduldesign
Verstecken von Implementierungsdetails Vereinfachung des Client-Codes Verringerung von Abhängigkeiten zwischen Modulen und Clients Erhöhung der Wiederverwendbarkeit Client-Code lesbarer und verständlich ohne Wissen über unterliegende Implementierung Abstraktion in einer Black Box
Geeignete Implementierungsstrategie abhängig von der Art der Nutzung des Moduls Implementierungs-entscheidungen  selten dokumentiert für bestimmte Fälle ungeeignet nicht anpassbar zu starke Abstraktion Client weiß meist am besten welche Strategie geeignet wäre Probleme der Black Box
Implementierungs-entscheidungen nicht im Interface sichtbar, aber: Performanceauswirkungen Abbildung von High-Level auf Low-Level Funktionen vielfältig möglich Beeinflussen Performance Entscheidung daher feststehend, aber nicht verborgen Keine 100%ige Black Box möglich
Neuimplementierung von Interfacefunktionen Um gewünschte Eigenschaften zu erreichen Code wird größer und komplexer „ Code zwischen den Zeilen“ Behandelt Probleme die eigentlich vom Interface verborgen werden sollten Basiert auf undokumentierten Interna, verborgen vom Interface, aber dem Programmierer bekannt Probleme und Workarounds
Lösung: Reflektive Module Basis Interface Bietet Funktionalität an Das WAS Meta Interface Ermöglicht Steuerung des Basis Interfaces Das WIE
Reflektive Module/Programme Vorteile Schnittstellennutzung jetzt wieder als Black Box Konfiguration bzw. Implementierungsstrategie der Black Box vom Client wählbar Programmierer können sich auf Modulnutzung konzentrieren Optimierung/Konfiguration separat möglich
Frameworks Aufteilung in Client API und Framework API Konfigurationsdateien, Konstanten, Parameter, Flags, … Dependency Injection als Pattern verbreitet Funktionen mit Callbacks altbekannt Umsetzungsmöglichkeiten
Frameworks sollten Erweiterungs- bzw. Spezialisierungspunkte anbieten Problematische Teile vom Client anpassbar Anpassung, Konfiguration über Meta-APIs Design trotzdem nicht mit den zu kapselnden Details überfrachten Auf geeignete Trennung zwischen WAS und WIE achten Zusammenfassung Open Implementations
RELEVANTE SPRACHFEATURES VON PHP Magic Methods und die Reflection API
Dynamische Object-Properties __get(), __set() Werden verwendet wenn die angefragten Properties nicht vorhanden sind z. B. für Validierung und Vermeidung von unspezifizierten Properties __isset(), __unset() __clone() : ändert Semantik von  clone __toString(), __sleep(), __wakeup(), __set_state() Magic Methods
__autoload($className) Ermöglicht echtes Lazy-loading von Klassen Implementiert eigene Laderoutine __call($methodName, $args) Ermöglicht echtes Late-Binding Instanzverhalten zur Laufzeit entscheidbar __callStatic($methodName, $args) Late-Binding für Klassenmethoden Magic Methods
Reflection API Klassendiagramm der Reflection API von PHP 5.2
 
 
REFLECTION UND RUNKIT FÜR DIE TOOL-ENTWICKLUNG MIT PHP phpCrow, ezcReflection und isvcRunkit
 
Generierten Code ausführen:  eval() Funktionen erstellen:  create_function() Dynamische Aufrufe: call_user_function() call_user_function_array() call_user_method() call_user_method_array() $functionName($a, $b); Intercession mit Standard-PHP
$func  = create_function( '$foo,$bar' , 'echo "CreatedFunction:  $foo $bar";' ); $func ( 'Hello' ,  'World! ' ); var_dump(addslashes( $func )); call_user_func( $func ,  'FOO' ,  'baz' ); //common usage example, with performance issues! $av  = array( ' the  ' ,  ' a  ' ,  ' that  ' ,  ' this  ' ); array_walk( $av , create_function( ' &$v,$k ' ,  ' $v = $v . "mango"; ' )) ; print_r( $av ); create_function
class  InvokeTest { public   function  callMe() { echo  "Yeah, you called me!" ; } } $o  = new InvokeTest(); $class  = new ReflectionClass( $o ); $method  =  $class ->getMethod( 'callMe' ); $method ->invoke( $o ); function  fooFunc( $bar ) { echo  "$bar" ; } $func  =  'fooFunc' ; $func ( 'Hello World' ); Funktionen/Methoden Aufrufe
ezcReflection
ezcReflection
ezcReflection
ezcReflection
ezcReflection Überblick Ermöglicht Reflection auf PHPDoc-Annotationen Erweiterte Typ-Informationen zur Laufzeit  Aber keine direkten  Laufzeit-Einflüsse der Typ-Annotationen Design ermöglicht beliebige Erweiterungen der Reflection API als Datenquelle mit zu nutzen z. B. eine StaticReflection Genutzt für z. B. WSDL Generierung
/** * @webservice */ class  HelloWorld { /** * @var string */ private   $hello  =  'Hello' ; /** * @param string $name * @return string * @webmethod */ public function  getGreeting( $name ) { return   "$this->hello $name!" ; } } Annotationen
Intercession mit Runkit
ezcReflection und isvcRunkit
ZUSAMMENFASSUNG Metaprogramming und Reflection
PHP hat viele Features um Reflection einzusetzen Intercession über Runkit-Extension Vorallem für Tool-Entwicklung Reflection hat Einflüsse auf Performance PHP Ausführungsmodell beachten Besonders in Web-Anwendungen nicht erste Wahl Nützlich für länger lebende Prozesse/Programme z. B. GTK+, QT, MFC oder Kommandozeilen-Anwendungen Zusammenfassung
Literatur Paper zu diesem Vortrag G. GABRYSIAK, S. MARR, AND F. MENGE,  Meta Programming and Reflection in PHP , Hasso-Plattner Institute, Universiy of Potsdam, Germany, February 2008.  https://instantsvc.svn.sourceforge.net/svnroot/instantsvc/branches/metaprogramming/doc/ Der Code phpCrow – A PHP-PHP-IDE , February 2008.  https://instantsvc.svn.sourceforge.net/svnroot/instantsvc/branches/metaprogramming/src/MetaPHP ezcReflection , SVN Repository, eZ Components, January 2008.  http://svn.ez.no/svn/ezcomponents/experimental/Reflection
Weitere Literatur und Software [1] R. HIRSCHFELD,  Course on "Metaprogrammierung und Reflection" , 2007. Lecture Material, Non-public. [2] G. BRACHA AND D. UNGAR,  Mirrors: design principles for meta-level facilities of object-oriented programming languages , in OOPSLA '04: Proceedings of the 19th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, New York, NY, USA, 2004, ACM, pp. 331–344. [3] S. GOLEMON,  Runkit , PHP Extension, The PHP Group, January 2008.  http://pecl.php.net/package/runkit [4] A. P. GREGOR KICZALES,  Open Implementations and Metaobject Protocols , MIT Press, Cambridge, MA, USA, 1996.  http://www2.parc.com/csl/groups/sda/publications/papers/Kiczales-TUT95/for-web.pdf [5] PHP DOCUMENTATION GROUP,  PHP Manual , documentation, November 2007.  http://www.php.net/manual/en/language.oop5.reflection.php [6] THE PHP GROUP,  PHP Extension Community Library , Project Site, January 2008.  http://pecl.php.net/

Weitere ähnliche Inhalte

Ähnlich wie Metaprogrammierung und Reflection

Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit Wordpress
Blogwerk AG
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Bjoern Reinhold
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite Applications
Andreas Schulte
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Gregor Biswanger
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
Andreas Schulte
 
Templates, Code & Tools
Templates, Code & ToolsTemplates, Code & Tools
Templates, Code & Tools
Ulrich Krause
 
PAVONE Espresso Workflow für Java EE
PAVONE Espresso Workflow für Java EEPAVONE Espresso Workflow für Java EE
PAVONE Espresso Workflow für Java EE
Udo Sill
 
Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
Hans-Joachim Piepereit
 
Top 10 Internet Trends 2006
Top 10 Internet Trends 2006Top 10 Internet Trends 2006
Top 10 Internet Trends 2006
Jürg Stuker
 
IfN Studienarbeit Abschlusspres 18.9.2007
IfN Studienarbeit Abschlusspres 18.9.2007IfN Studienarbeit Abschlusspres 18.9.2007
IfN Studienarbeit Abschlusspres 18.9.2007
derDoc
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisieren
Christian Münch
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
OPITZ CONSULTING Deutschland
 
Software Metrics and Continuous Integration
Software Metrics and Continuous IntegrationSoftware Metrics and Continuous Integration
Software Metrics and Continuous Integration
Milena Reichel
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS Programmierung
Markus Leutwyler
 
Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Top 10 Internet Trends 2001
Top 10 Internet Trends 2001
Jürg Stuker
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
Eduard Hildebrandt
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Ralf Eggert
 
Python in der Luft- und Raumfahrt
Python in der Luft- und RaumfahrtPython in der Luft- und Raumfahrt
Python in der Luft- und Raumfahrt
Andreas Schreiber
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
Torben Brodt
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
A. LE
 

Ähnlich wie Metaprogrammierung und Reflection (20)

Entwickeln mit Wordpress
Entwickeln mit WordpressEntwickeln mit Wordpress
Entwickeln mit Wordpress
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite Applications
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
 
Templates, Code & Tools
Templates, Code & ToolsTemplates, Code & Tools
Templates, Code & Tools
 
PAVONE Espresso Workflow für Java EE
PAVONE Espresso Workflow für Java EEPAVONE Espresso Workflow für Java EE
PAVONE Espresso Workflow für Java EE
 
Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
 
Top 10 Internet Trends 2006
Top 10 Internet Trends 2006Top 10 Internet Trends 2006
Top 10 Internet Trends 2006
 
IfN Studienarbeit Abschlusspres 18.9.2007
IfN Studienarbeit Abschlusspres 18.9.2007IfN Studienarbeit Abschlusspres 18.9.2007
IfN Studienarbeit Abschlusspres 18.9.2007
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisieren
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Software Metrics and Continuous Integration
Software Metrics and Continuous IntegrationSoftware Metrics and Continuous Integration
Software Metrics and Continuous Integration
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS Programmierung
 
Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Top 10 Internet Trends 2001
Top 10 Internet Trends 2001
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
 
Python in der Luft- und Raumfahrt
Python in der Luft- und RaumfahrtPython in der Luft- und Raumfahrt
Python in der Luft- und Raumfahrt
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
 

Mehr von Stefan Marr

Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Stefan Marr
 
Seminar on Parallel and Concurrent Programming
Seminar on Parallel and Concurrent ProgrammingSeminar on Parallel and Concurrent Programming
Seminar on Parallel and Concurrent Programming
Stefan Marr
 
Optimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with TruffleOptimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with Truffle
Stefan Marr
 
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
Stefan Marr
 
Why Is Concurrent Programming Hard? And What Can We Do about It?
Why Is Concurrent Programming Hard? And What Can We Do about It?Why Is Concurrent Programming Hard? And What Can We Do about It?
Why Is Concurrent Programming Hard? And What Can We Do about It?
Stefan Marr
 
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Stefan Marr
 
Building High-Performance Language Implementations With Low Effort
Building High-Performance Language Implementations With Low EffortBuilding High-Performance Language Implementations With Low Effort
Building High-Performance Language Implementations With Low Effort
Stefan Marr
 
Cloud PARTE: Elastic Complex Event Processing based on Mobile Actors
Cloud PARTE: Elastic Complex Event Processing based on Mobile ActorsCloud PARTE: Elastic Complex Event Processing based on Mobile Actors
Cloud PARTE: Elastic Complex Event Processing based on Mobile Actors
Stefan Marr
 
Supporting Concurrency Abstractions in High-level Language Virtual Machines
Supporting Concurrency Abstractions in High-level Language Virtual MachinesSupporting Concurrency Abstractions in High-level Language Virtual Machines
Supporting Concurrency Abstractions in High-level Language Virtual Machines
Stefan Marr
 
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
Stefan Marr
 
Sly and the RoarVM: Parallel Programming with Smalltalk
Sly and the RoarVM: Parallel Programming with SmalltalkSly and the RoarVM: Parallel Programming with Smalltalk
Sly and the RoarVM: Parallel Programming with Smalltalk
Stefan Marr
 
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
Stefan Marr
 
Sly and the RoarVM: Exploring the Manycore Future of Programming
Sly and the RoarVM: Exploring the Manycore Future of ProgrammingSly and the RoarVM: Exploring the Manycore Future of Programming
Sly and the RoarVM: Exploring the Manycore Future of Programming
Stefan Marr
 
PHP.next: Traits
PHP.next: TraitsPHP.next: Traits
PHP.next: Traits
Stefan Marr
 
The Price of the Free Lunch: Programming in the Multicore Era
The Price of the Free Lunch: Programming in the Multicore EraThe Price of the Free Lunch: Programming in the Multicore Era
The Price of the Free Lunch: Programming in the Multicore Era
Stefan Marr
 
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
Stefan Marr
 
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
Stefan Marr
 
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
Stefan Marr
 
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
Stefan Marr
 
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
Stefan Marr
 

Mehr von Stefan Marr (20)

Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
 
Seminar on Parallel and Concurrent Programming
Seminar on Parallel and Concurrent ProgrammingSeminar on Parallel and Concurrent Programming
Seminar on Parallel and Concurrent Programming
 
Optimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with TruffleOptimizing Communicating Event-Loop Languages with Truffle
Optimizing Communicating Event-Loop Languages with Truffle
 
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
Tracing versus Partial Evaluation: Which Meta-Compilation Approach is Better ...
 
Why Is Concurrent Programming Hard? And What Can We Do about It?
Why Is Concurrent Programming Hard? And What Can We Do about It?Why Is Concurrent Programming Hard? And What Can We Do about It?
Why Is Concurrent Programming Hard? And What Can We Do about It?
 
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
Zero-Overhead Metaprogramming: Reflection and Metaobject Protocols Fast and w...
 
Building High-Performance Language Implementations With Low Effort
Building High-Performance Language Implementations With Low EffortBuilding High-Performance Language Implementations With Low Effort
Building High-Performance Language Implementations With Low Effort
 
Cloud PARTE: Elastic Complex Event Processing based on Mobile Actors
Cloud PARTE: Elastic Complex Event Processing based on Mobile ActorsCloud PARTE: Elastic Complex Event Processing based on Mobile Actors
Cloud PARTE: Elastic Complex Event Processing based on Mobile Actors
 
Supporting Concurrency Abstractions in High-level Language Virtual Machines
Supporting Concurrency Abstractions in High-level Language Virtual MachinesSupporting Concurrency Abstractions in High-level Language Virtual Machines
Supporting Concurrency Abstractions in High-level Language Virtual Machines
 
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
Identifying A Unifying Mechanism for the Implementation of Concurrency Abstra...
 
Sly and the RoarVM: Parallel Programming with Smalltalk
Sly and the RoarVM: Parallel Programming with SmalltalkSly and the RoarVM: Parallel Programming with Smalltalk
Sly and the RoarVM: Parallel Programming with Smalltalk
 
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
Which Problems Does a Multi-Language Virtual Machine Need to Solve in the Mul...
 
Sly and the RoarVM: Exploring the Manycore Future of Programming
Sly and the RoarVM: Exploring the Manycore Future of ProgrammingSly and the RoarVM: Exploring the Manycore Future of Programming
Sly and the RoarVM: Exploring the Manycore Future of Programming
 
PHP.next: Traits
PHP.next: TraitsPHP.next: Traits
PHP.next: Traits
 
The Price of the Free Lunch: Programming in the Multicore Era
The Price of the Free Lunch: Programming in the Multicore EraThe Price of the Free Lunch: Programming in the Multicore Era
The Price of the Free Lunch: Programming in the Multicore Era
 
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
Locality and Encapsulation: A Foundation for Concurrency Support in Multi-Lan...
 
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
Insertion Tree Phasers: Efficient and Scalable Barrier Synchronization for Fi...
 
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
Encapsulation and Locality: A Foundation for Concurrency Support in Multi-Lan...
 
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
Intermediate Language Design of High-level Language VMs: Towards Comprehensiv...
 
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
Virtual Machine Support for Many-Core Architectures: Decoupling Abstract from...
 

Metaprogrammierung und Reflection

  • 1. Wer nutzt die PHP-Reflection API? Und für was?
  • 2. Fragen können jederzeit gestellt werden
  • 3. Metaprogrammierung und Reflection Tool-Entwicklung für und mit PHP Stefan Marr PHP Unconference 26./27. April 2008
  • 4. Begriffsklärung Open Implementations Metaprogrammierung und Frameworkdesign Relevante Sprachfeatures von PHP Reflection und Runkit für die Tool-Entwicklung Zusammenfassung Agenda
  • 5. METAPROGRAMMIERUNG UND REFLECTION Kurze Begriffsklärung zur Einleitung
  • 6. Verarbeitendes System Daten repräsentieren Domäne Programm beschreibt Veränderungen Interpreter führt Programm aus Domäne Buchhaltung, Kundendaten, Logistik, Webinhalte, … nach [1]
  • 7. Kausal verbundenes System Ursache-Wirkungsbeziehung zwischen System und Domäne Direkte wechselseitige Auswirkungen Regellungstechnik Klimaanlagen Autopiloten … nach [1]
  • 8. Meta-System Spezielle Domäne: Programme Meta-Programme und -system arbeiten auf Basis-Programmen und -systemen Compiler Code-Transformation, Generierung … nach [1]
  • 9. Reflektives System Spezielle Meta-Systeme Selbstrepräsentation bestimmter Strukturen Kausal verbunden Reflektives Verhalten Introspection (beobachten) Intercession (Selbstveränderung) nach [1]
  • 10. Meta- und Reflektive Systeme Kausal verbunden Meta-System Reflektiv nach [1]
  • 12. Verstecken von Implementierungsdetails Vereinfachung des Client-Codes Verringerung von Abhängigkeiten zwischen Modulen und Clients Erhöhung der Wiederverwendbarkeit Client-Code lesbarer und verständlich ohne Wissen über unterliegende Implementierung Abstraktion in einer Black Box
  • 13. Geeignete Implementierungsstrategie abhängig von der Art der Nutzung des Moduls Implementierungs-entscheidungen selten dokumentiert für bestimmte Fälle ungeeignet nicht anpassbar zu starke Abstraktion Client weiß meist am besten welche Strategie geeignet wäre Probleme der Black Box
  • 14. Implementierungs-entscheidungen nicht im Interface sichtbar, aber: Performanceauswirkungen Abbildung von High-Level auf Low-Level Funktionen vielfältig möglich Beeinflussen Performance Entscheidung daher feststehend, aber nicht verborgen Keine 100%ige Black Box möglich
  • 15. Neuimplementierung von Interfacefunktionen Um gewünschte Eigenschaften zu erreichen Code wird größer und komplexer „ Code zwischen den Zeilen“ Behandelt Probleme die eigentlich vom Interface verborgen werden sollten Basiert auf undokumentierten Interna, verborgen vom Interface, aber dem Programmierer bekannt Probleme und Workarounds
  • 16. Lösung: Reflektive Module Basis Interface Bietet Funktionalität an Das WAS Meta Interface Ermöglicht Steuerung des Basis Interfaces Das WIE
  • 17. Reflektive Module/Programme Vorteile Schnittstellennutzung jetzt wieder als Black Box Konfiguration bzw. Implementierungsstrategie der Black Box vom Client wählbar Programmierer können sich auf Modulnutzung konzentrieren Optimierung/Konfiguration separat möglich
  • 18. Frameworks Aufteilung in Client API und Framework API Konfigurationsdateien, Konstanten, Parameter, Flags, … Dependency Injection als Pattern verbreitet Funktionen mit Callbacks altbekannt Umsetzungsmöglichkeiten
  • 19. Frameworks sollten Erweiterungs- bzw. Spezialisierungspunkte anbieten Problematische Teile vom Client anpassbar Anpassung, Konfiguration über Meta-APIs Design trotzdem nicht mit den zu kapselnden Details überfrachten Auf geeignete Trennung zwischen WAS und WIE achten Zusammenfassung Open Implementations
  • 20. RELEVANTE SPRACHFEATURES VON PHP Magic Methods und die Reflection API
  • 21. Dynamische Object-Properties __get(), __set() Werden verwendet wenn die angefragten Properties nicht vorhanden sind z. B. für Validierung und Vermeidung von unspezifizierten Properties __isset(), __unset() __clone() : ändert Semantik von clone __toString(), __sleep(), __wakeup(), __set_state() Magic Methods
  • 22. __autoload($className) Ermöglicht echtes Lazy-loading von Klassen Implementiert eigene Laderoutine __call($methodName, $args) Ermöglicht echtes Late-Binding Instanzverhalten zur Laufzeit entscheidbar __callStatic($methodName, $args) Late-Binding für Klassenmethoden Magic Methods
  • 23. Reflection API Klassendiagramm der Reflection API von PHP 5.2
  • 24.  
  • 25.  
  • 26. REFLECTION UND RUNKIT FÜR DIE TOOL-ENTWICKLUNG MIT PHP phpCrow, ezcReflection und isvcRunkit
  • 27.  
  • 28. Generierten Code ausführen: eval() Funktionen erstellen: create_function() Dynamische Aufrufe: call_user_function() call_user_function_array() call_user_method() call_user_method_array() $functionName($a, $b); Intercession mit Standard-PHP
  • 29. $func = create_function( '$foo,$bar' , 'echo "CreatedFunction: $foo $bar";' ); $func ( 'Hello' , 'World! ' ); var_dump(addslashes( $func )); call_user_func( $func , 'FOO' , 'baz' ); //common usage example, with performance issues! $av = array( ' the ' , ' a ' , ' that ' , ' this ' ); array_walk( $av , create_function( ' &$v,$k ' , ' $v = $v . "mango"; ' )) ; print_r( $av ); create_function
  • 30. class InvokeTest { public function callMe() { echo "Yeah, you called me!" ; } } $o = new InvokeTest(); $class = new ReflectionClass( $o ); $method = $class ->getMethod( 'callMe' ); $method ->invoke( $o ); function fooFunc( $bar ) { echo "$bar" ; } $func = 'fooFunc' ; $func ( 'Hello World' ); Funktionen/Methoden Aufrufe
  • 35. ezcReflection Überblick Ermöglicht Reflection auf PHPDoc-Annotationen Erweiterte Typ-Informationen zur Laufzeit Aber keine direkten Laufzeit-Einflüsse der Typ-Annotationen Design ermöglicht beliebige Erweiterungen der Reflection API als Datenquelle mit zu nutzen z. B. eine StaticReflection Genutzt für z. B. WSDL Generierung
  • 36. /** * @webservice */ class HelloWorld { /** * @var string */ private $hello = 'Hello' ; /** * @param string $name * @return string * @webmethod */ public function getGreeting( $name ) { return "$this->hello $name!" ; } } Annotationen
  • 40. PHP hat viele Features um Reflection einzusetzen Intercession über Runkit-Extension Vorallem für Tool-Entwicklung Reflection hat Einflüsse auf Performance PHP Ausführungsmodell beachten Besonders in Web-Anwendungen nicht erste Wahl Nützlich für länger lebende Prozesse/Programme z. B. GTK+, QT, MFC oder Kommandozeilen-Anwendungen Zusammenfassung
  • 41. Literatur Paper zu diesem Vortrag G. GABRYSIAK, S. MARR, AND F. MENGE, Meta Programming and Reflection in PHP , Hasso-Plattner Institute, Universiy of Potsdam, Germany, February 2008. https://instantsvc.svn.sourceforge.net/svnroot/instantsvc/branches/metaprogramming/doc/ Der Code phpCrow – A PHP-PHP-IDE , February 2008. https://instantsvc.svn.sourceforge.net/svnroot/instantsvc/branches/metaprogramming/src/MetaPHP ezcReflection , SVN Repository, eZ Components, January 2008. http://svn.ez.no/svn/ezcomponents/experimental/Reflection
  • 42. Weitere Literatur und Software [1] R. HIRSCHFELD, Course on "Metaprogrammierung und Reflection" , 2007. Lecture Material, Non-public. [2] G. BRACHA AND D. UNGAR, Mirrors: design principles for meta-level facilities of object-oriented programming languages , in OOPSLA '04: Proceedings of the 19th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, New York, NY, USA, 2004, ACM, pp. 331–344. [3] S. GOLEMON, Runkit , PHP Extension, The PHP Group, January 2008. http://pecl.php.net/package/runkit [4] A. P. GREGOR KICZALES, Open Implementations and Metaobject Protocols , MIT Press, Cambridge, MA, USA, 1996. http://www2.parc.com/csl/groups/sda/publications/papers/Kiczales-TUT95/for-web.pdf [5] PHP DOCUMENTATION GROUP, PHP Manual , documentation, November 2007. http://www.php.net/manual/en/language.oop5.reflection.php [6] THE PHP GROUP, PHP Extension Community Library , Project Site, January 2008. http://pecl.php.net/

Hinweis der Redaktion

  1. Einstiegsfragen ans Publikum: Wer benutzt Reflection und wofür?