This is a low-level, and philosophical discussion on the act of compiling data out of your PHP applications using Zend\Code: Scanning, Generating, Annotating code in PHP.
2. Who Am I?
•Ralph Schindler (ralphschindler)
Software Engineer on the Zend Framework team
•At Zend for almost 4 years
•Before that TippingPoint/3Com
Programming PHP for 13+ years
Live in New Orleans, LA.
•Lived in Austin, Tx for 5 years
2
3. Why Skynet?
•From wikipedia:
“ ... an artificially intelligent system which
became self-aware and revolted against its
creators.”
“The strategy behind Skynet's creation was to
remove the possibility of human error and slow
reaction time to guarantee fast, efficient response
to enemy attack.”
3
6. Why Skynet?
•So, what does Skynet look like?
•Anything we develop that looks
too magical
too-good-to-be-true
too all-encompassing
too flexible / too many input types
requires too much documentation
is outside our normal understanding of how things
work
6
7. Why Skynet?
•What does Skynet not look like?
Simple
Easy to understand
Finite inputs / outputs
Easy to get up and running with
7
8. Why Skynet
•In a nutshell: PHP
PHP has no development time compile phase
On it’s own, it doesn’t know much
•Hence, the many upon many frameworks
All decisions are pushed into “request” time
Single strategy for performance increase
•caching
•black-box optimizer
8
9. Why Skynet?
•Basically, ZendCode is Skynet (figuratively)
it can understand your code, sometimes better
than the developer whom wrote it
it can expose information about your code that the
developer was unaware of
it can generate code faster than you can
9
10. Why Skynet?
•Ok, not really
•ZendCode will not:
see developers as a threat
attempt to take over the world
send the Terminator (a.k.a Matthew Weier
O’Phinney) after you for writing bad,
unmaintainable, code
10
13. Let’s Recap the Humble Beginnings
•ZF1 users wanted scaffolding & RAD
•So, ...
Zend_Tool
•Zend_Tool_Project / Zend_Tool_Framework
Zend_CodeGenerator
•original intention was more than PHP
Zend_Reflection
•added docblock parsing functionality
13
14. ZF1 Problem Area
•This setup suffered from 2 major problems:
Runtime dependencies are not always loaded
Same request changes to structures do not update
in-memory structures
14
16. Problem 2
•Workflow (in the same request):
Require File
Build ZendCodeGenerator object based off Zend
Reflection object of a class
•(For example a controller)
Add method to class
Write to disk
Build ZendCodeGenerator object based off Zend
Reflection object
•FAIL! B/c file is already in memory
16
17. Problem 2 - Temporary Solution
•Temporary solution was to cache generator
objects that were built based one particular
reflection objects, and return those when asked
for a generator object seeded with a known
reflection object
•“We’ll fix this in ZF2”
17
18. Other Realizations
•We were not going to get other generator types
•Generators were closely related to Reflection
and the new Scanner component
•ZendCode was a better place for all of this
18
20. Static vs. Dynamic
•Typical PHP workflow for dynamic applications:
initiate request
fulfill request
return to consumer
20
21. Static vs. Dynamic
•Typical PHP workflow for “static” applications
with compilation built in (dev time):
initiate request
compile (during request, but omitted during production)
fulfill request
return to consumer
21
22. Static vs. Dynamic
•Typical PHP workflow for “static” applications
with compilation NOT built in (dev time):
(change code)
(compile code)
initiate request
fulfill request
return to consumer
22
23. Static vs. Dynamic
•You’ve probably seen static analysis in some way before:
Caching
•If you never intend on expiring the data, it’s not really a cache
if (!file_exists(..)) { file_put_contents(..., var_export()) }
Zend Optimizer / APC
Content Platforms:
•Drupal
– development mode
– non-caching mode
– module initialization
•Wordpress
– installation hooks: plugin initialization
23
24. What are we compiling?
•Anything dynamically looked up
What the valid routes are
What the valid application assets are
•classes
•view scripts
Where particular classes are located
More?
•Which extensions are loaded
•What the php environment can support
24
25. So, What Is Our Toolset?
•ZendCode
ZendCodeReflection
ZendCodeGenerator
ZendCodeScanner
ZendCodeAnnotation
25
26. ZendCodeReflection
•Originally part of ZF1
•Added features:
file reflection
docblock reflection
26
31. ZendCodeScanner
•ZendCodeScanner
Token based “reflection”
Reflection for files in ZF1 has a similar approach
Ascertain information in files:
•what namespaces are inside this file
•what use statements are inside a particular namespace
•what classes are in this file’s namespaces
•what files are required (none, right?)
•is there a file level docblock
31
34. ZendCodeAnnotation
•Annotations
Why? You asked for it. At least some of you did.
There’s no native PHP support for it
Similar to:
•Java’s Annotation system
•C#’s Attribute system
•Doctrine’s Annotation system
•with a PHP twist of course
34
35. ZendCodeAnnotation
•Design:
Do not force content into a particular DSL
Build as a simple easy to use framework for easy consumption
Prototype pattern
Use ZendCodeScanner
•Drawbacks
Slow, very very slow
35
36. ZendCodeAnnotation
•Single Interface to implement:
ZendCodeAnnotationAnnotation
36
39. Demo 2: Built a Micro-framework
•Goals
Find on github.com/ralphschindler/middlewarephp
few classes - the “middleware” is editable
fast (2ms request for hello world)
compilation based
•Routes
•Classmap autoloader
annotation based
utilize include returns, closures, and arrays
•Demo
39
40. Philisophical
•Let’s get philosophical:
Should we be “compiling” elements?
•Is this what PHP is all about?
•Rasmus says yes.
Can we architect flexible and performant
applications without some kind of static code
analysis that affects runtime?
How do we introduce these tasks into developer
workflows where they make the most sense, don’t
impede development?
40
41. Fin
•Questions and/or comments, let’s go grab a beer discuss.
•Remember ZF2 is only beta, if you have opinions on how we
should go about applying these techniques, get involved NOW!
•Thank you!
41