Building Modern PHP Applications



How PHP language, tool, and framework
advancements will help you improve your
            applications.
Me
●   Developer at Blend
    Interactive
    (blendinteractive.com)
●   Sioux Falls, SD
●   Contact Me:
    –   shellrunner.com
    –   @jacksonmurtha
    –   github.com/jxn
    –   gplus.to/jacksonmurtha
    –   jackson@jacksonmurtha.com
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?
PHP's 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)
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
Valid Criticisms
●   Naming / parameter consistency*
●   Multi-byte strings can cause problems*
●   Threading*
●   Few “forced” conventions*
●   PHP is rarely “first to feature”*
●   ???
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
PHP is constantly evolving
●   Release / cultural
    changes
●   Feature removal
●   New PHP features
●   New PHP tools
●   Second generation
    frameworks
●   New external tools
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
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....
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
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
Namespaces
     ●   Encapsulate Classes,
         Interfaces, Functions,
         Constants, Traits
     ●   Provide grouping, prevent
         collisions, allow aliasing
     ●   Encourage segregation of
         code
     ●   Replace hackish
         alternatives
     ●   Compile-time, not runtime
PDO
●   PHP Data Objects
●   “data-access” abstraction layer
●   Provide for object-oriented database access
●   Encourage prepared statements:
Phar
●   Single-file PHP archive
●   Executable package
●   Can access assets within and outside itself
●   phar:// stream wrapper available
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.
Garbage Collection / Late Static Binding /
Performance and memory enhancements
●   Efficiency gains
●   Don't try to outsmart the compiler
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
Array Dereferencing
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
Traits
●   Horizontal code-reuse
    (cf. mixins)
●   “Compiler-assisted
    copy and paste”
●   Obey most class
    behaviors, but cannot
    be instantiated
●   Traits can be
    composed of other
    traits
●   Aliasing and collision
    prevention with 'as'
    and 'insteadof'
●   Multiple traits can be
    used at once
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?
Generators
●   Simpler method for working with iterators
●   Nearly identical to the python implementation
Setters / Getters
Password API
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
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';
Composer.json
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
Symfony 2.0
●   Installation/dependency resolution: Composer
Component Development
●   Bundles
●   Scaffolding
●   ORM
●   Components
    symfony.com/components:
    –   Routing
    –   EventDispatcher
    –   HttpFoundation/HttpKernel
    –   Assetic
Run Symfony
●   run php ./app/console server:run
●   or configure webserver manually
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
Create the bundle definition class
●   contains
    namespaces and
    build functions for the
    bundle, if necessary
Create a controller class
Create view / Create routes
Register the bundle in AppKernel
Create a bundle: the easy way

●   Generates:
    –   template skeleton
    –   resource directories
    –   appKernel registry
    –   unit test skeleton
    –   bundle definition class
    –   default controller
●   multiple routing options
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?
The End...
●   Questions...
●   Feedback...

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

  • 1.
    Building Modern PHPApplications How PHP language, tool, and framework advancements will help you improve your applications.
  • 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.
    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.
    PHP's 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.
    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.
    Valid Criticisms ● Naming / parameter consistency* ● Multi-byte strings can cause problems* ● Threading* ● Few “forced” conventions* ● PHP is rarely “first to feature”* ● ???
  • 7.
    Changes to theweb ● 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.
    PHP is constantlyevolving ● Release / cultural changes ● Feature removal ● New PHP features ● New PHP tools ● Second generation frameworks ● New external tools
  • 9.
    Release / coredevelopment 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.
    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.
    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.
    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.
    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.
    PDO ● PHP Data Objects ● “data-access” abstraction layer ● Provide for object-oriented database access ● Encourage prepared statements:
  • 15.
    Phar ● Single-file PHP archive ● Executable package ● Can access assets within and outside itself ● phar:// stream wrapper available
  • 16.
    Closures / Lambdafunctions ● Hijacked from functional languages ● More efficient than create_function() ● Very useful for sort(), array_map(), array_filter(), or function using a callback parameter.
  • 17.
    Garbage Collection /Late Static Binding / Performance and memory enhancements ● Efficiency gains ● Don't try to outsmart the compiler
  • 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.
  • 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.
    Traits ● Horizontal code-reuse (cf. mixins) ● “Compiler-assisted copy and paste” ● Obey most class behaviors, but cannot be instantiated
  • 22.
    Traits can be composed of other traits ● Aliasing and collision prevention with 'as' and 'insteadof' ● Multiple traits can be used at once
  • 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.
    Generators ● Simpler method for working with iterators ● Nearly identical to the python implementation
  • 25.
  • 26.
  • 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.
    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.
  • 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.
    Symfony 2.0 ● Installation/dependency resolution: Composer
  • 32.
    Component Development ● Bundles ● Scaffolding ● ORM ● Components symfony.com/components: – Routing – EventDispatcher – HttpFoundation/HttpKernel – Assetic
  • 33.
    Run Symfony ● run php ./app/console server:run ● or configure webserver manually
  • 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.
    Create the bundledefinition class ● contains namespaces and build functions for the bundle, if necessary
  • 36.
  • 37.
    Create view /Create routes
  • 38.
    Register the bundlein AppKernel
  • 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.
    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.
    The End... ● Questions... ● Feedback...