"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012


Published on

"Building Modern PHP Applications" by Jackson Murtha, given November 10, 2012, at South Dakota Code Camp 2012 in Sioux Falls.

  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012

  1. 1. Building Modern PHP ApplicationsHow PHP language, tool, and frameworkadvancements will help you improve your applications.
  2. 2. Me● Developer at Blend Interactive (blendinteractive.com)● Sioux Falls, SD● Contact Me: – shellrunner.com – @jacksonmurtha – github.com/jxn – gplus.to/jacksonmurtha – jackson@jacksonmurtha.com
  3. 3. Attendee Survey● Are you developing applications in PHP? – Which version? Which Platform(s)? – Are you using a framework?● What other languages are you using?● Are you testing your PHP applications? – Unit testing? Browser integration testing?
  4. 4. PHPs Image Problem● Language origins● Deprecated features● Disorganized/disparate community● Poor release-planning● Persistent myths● Bad code (in high-profile applications)● New features are not well known● Some legitimate concerns (threads, enforced security policies, naming / param consistency)
  5. 5. PHP Myths● OOP is difficult or impossible ● Not a “real” programming language – a preprocessor● Performance problems ● Insecure● Windows is a second-class citizen ● All “blog code”● Community in decline ● Immature platform or only immature● Difficult/Impossible to separate applications responsibilities (view-code littered with business logic) ● Poor garbage collection● Not testable ● Tools are outdated● Tools are focused on the document-web ● Everything is global ● Fate of the language is tied to the fate of● No longer needed given client-side state mod_php● Dumb PHP “features” get in the way ● No modern language features● New deployment methods are not ● Not enterprise-friendly available (e.g. Heroku) ● Difficult to add contributions● Poorly-managed releases, slow release cycle ● No visibility of roadmap
  6. 6. Valid Criticisms● Naming / parameter consistency*● Multi-byte strings can cause problems*● Threading*● Few “forced” conventions*● PHP is rarely “first to feature”*● ???
  7. 7. Changes to the web● Javascript is now viable / sexy ● emergence of “big data”● ajax is ubiquitous ● multi-server environments● rising application complexity ● viability of non-shared hosting● client / browser enhancements ● rise of the web application and decline● ascendancy of the web API of the document web● new code lifespan requirements ● popularization of rails/django● popularity of agile development ● viability of compiled languages (C# /● automated application testing Java)● event-driven designs ● growth of the mobile web● virtualized environment advancements ● alternatives to database for storage● return of the generated static page ● commercialization of● new expectations and legal compliance software/developer tools and training● web development buzz and hype
  8. 8. PHP is constantly evolving● Release / cultural changes● Feature removal● New PHP features● New PHP tools● Second generation frameworks● New external tools
  9. 9. Release / core development changes● New developers on the core team● New RFC process● Reworked community resources● Feature-release timetable, ~1 year● Bugfix / maintenance timetable● Bug reporting improvements, reworked documentation approval process● Clearer expectations, more development visibility, smoother release transitions, greater predictability● Larger, more diverse developer community and a more experienced security team● Inter-framework cooperation & standards organizations
  10. 10. Framework Interop● http://php-fig.org● Growing influence, with three standards● PSR-0 – Autoloading/namespacing● PSR-1 – Basic coding standard● PSR-2 – Thorough style-guide● More coming....
  11. 11. Feature removal● Removal of some of the features caused the worst code offenses and security / predictability problems – Magic Quotes – register_globals – safe_mode – outdated mysql functions
  12. 12. New Features – PHP 5.0 – 5.3● Improved inheritance model● Namespaces● PDO● Closures● Phar● Exceptions● SPL work / extensions improvements● Late static binding● Garbage collector improvements
  13. 13. Namespaces ● Encapsulate Classes, Interfaces, Functions, Constants, Traits ● Provide grouping, prevent collisions, allow aliasing ● Encourage segregation of code ● Replace hackish alternatives ● Compile-time, not runtime
  14. 14. PDO● PHP Data Objects● “data-access” abstraction layer● Provide for object-oriented database access● Encourage prepared statements:
  15. 15. Phar● Single-file PHP archive● Executable package● Can access assets within and outside itself● phar:// stream wrapper available
  16. 16. Closures / Lambda functions● Hijacked from functional languages● More efficient than create_function()● Very useful for sort(), array_map(), array_filter(), or function using a callback parameter.
  17. 17. Garbage Collection / Late Static Binding /Performance and memory enhancements● Efficiency gains● Dont try to outsmart the compiler
  18. 18. New Features – 5.4● upload progress ● $this in closures● binary notation ● callable typehint● array short syntax ● jsonSerializable● array dereferencing interface● class member access ● short echo tag always on instantiation available● indirect method call by ● built-in webserver array var ● traits
  19. 19. Array Dereferencing
  20. 20. Built-in webserver● Easy / no configuration in most environments● Development-only● To start: php -S localhost:8000● Provides many server environment variables● Configuration php.ini, port, docroot can be changed at execution
  21. 21. Traits● Horizontal code-reuse (cf. mixins)● “Compiler-assisted copy and paste”● Obey most class behaviors, but cannot be instantiated
  22. 22. ● Traits can be composed of other traits● Aliasing and collision prevention with as and insteadof● Multiple traits can be used at once
  23. 23. New Features – 5.5● Password API● Setters / Getters● Generators● Intl improvements● array_column()● Fully-qualified class names● Try / Catch / Finally● Parameter skipping● Read-only properties● Named Parameters?
  24. 24. Generators● Simpler method for working with iterators● Nearly identical to the python implementation
  25. 25. Setters / Getters
  26. 26. Password API
  27. 27. New PHP Tools● Package tools – Composer (Pyrus/Pear2, Pear, Pecl, extensions, Pirum)● Testing tools – PHPUnit, Behat, Mink, php-selenium, goutte, phpspec● Static analysis tools – Php_Depend, phpcpd, phpdcd, codecoverage, codesniffer, mess detector, PHP-CS-Fixer
  28. 28. Composer● http://getcomposer.org● Repository management through packagist.org, bitbucket, github, etc.● Solves many issues with PEAR● easy install:● curl -s https://getcomposer.org/installer | php● Package lists, sources, dependencies, updates, installation locations● easy package setup, simple hosting setup, vcs/pear integration, github/bitbucket API tools, satis integration● library autoloading via require vendor/autoload.php;
  29. 29. Composer.json
  30. 30. Second Generation Frameworks● Post-PHP v. 5.3 – Symfony 2+, ZendFramework 2.0, Silex, (Lithium? CakePHP 2+ ?)● More modular than predecessors● Compliant with PHP-FIG (PSR-0)● Use modern PHP extensions, testing tools, OOP, abstraction layers
  31. 31. Symfony 2.0● Installation/dependency resolution: Composer
  32. 32. Component Development● Bundles● Scaffolding● ORM● Components symfony.com/components: – Routing – EventDispatcher – HttpFoundation/HttpKernel – Assetic
  33. 33. Run Symfony● run php ./app/console server:run● or configure webserver manually
  34. 34. Create a bundle: the “hard” way● Create a bundle directory in src/ – e.g. src/MyPackage/MyBundle● Create bundle definition class● Create controller class● Create routes● Create view● Register bundle in AppKernel
  35. 35. Create the bundle definition class● contains namespaces and build functions for the bundle, if necessary
  36. 36. Create a controller class
  37. 37. Create view / Create routes
  38. 38. Register the bundle in AppKernel
  39. 39. Create a bundle: the easy way● Generates: – template skeleton – resource directories – appKernel registry – unit test skeleton – bundle definition class – default controller● multiple routing options
  40. 40. Run the app● Start / visit webserver – app/console server:run● Navigate to your route to see the response – e.g. http://localhost:8000/app_dev.php/yourRoute/yourParameter● How is this better than non-framework PHP?● How is this better than existing (first-generation) frameworks?
  41. 41. The End...● Questions...● Feedback...