$30 off During Our Annual Pro Sale. View Details »

PHP 5.4 Features You'll Actually Use

PHP 5.4 Features You'll Actually Use

Zendcon session on PHP 5.4

Lorna Mitchell

October 24, 2012
Tweet

More Decks by Lorna Mitchell

Other Decks in Technology

Transcript

  1. The PHP 5.4 Features You Will
    Actually Use

    View Slide

  2. About Me
    • Lorna Jane Mitchell
    • PHP Consultant/Developer
    • Author of PHP Master
    • Twitter: @lornajane
    • Website: http://lornajane.net

    View Slide

  3. About PHP 5.4
    • New features
    • Traits
    • Built-in webserver
    • New array syntax and dereferencing
    • And more!
    • Removed some nonsense
    • This talk covers the best bits*
    * an entirely subjective selection

    View Slide

  4. Start With The Easy Bit

    View Slide

  5. New Array Syntax

    View Slide

  6. Array Syntax
    We had this:
    $game[] = 'paper';
    $game[] = 'scissors';
    $game[] = 'stone';
    print_r($game);
    $game[0] = 'paper';
    $game[1] = 'scissors';
    $game[2] = 'stone';
    print_r($game);

    View Slide

  7. Array Syntax
    Or this:
    $game = array('stone', 'paper', 'scissors');
    print_r($game);
    $game = array(0 => 'stone', 1 => 'paper', 2 => 'scissors');
    print_r($game);

    View Slide

  8. Array Syntax
    Now we can do:
    $game = ['scissors', 'stone', 'paper'];
    print_r($game);
    $game = [0 => 'scissors', 1 => 'stone', 2 => 'paper'];
    print_r($game);

    View Slide

  9. Array Dereferencing

    View Slide

  10. Array Dereferencing
    When an array is returned, immediately pick an element from it
    function getList() {
    return ['Grumpy', 'Sleepy', 'Bashful', 'Doc'];
    }
    // grab first item from list
    $item = getList()[0];
    echo $item; // Grumpy;

    View Slide

  11. PHP 5.4 Stealth Feature

    View Slide

  12. PHP 5.4 Is Faster

    View Slide

  13. PHP Versions Speed Comparison
    Benchmarks made using:
    • Newly-compiled vanilla PHP binaries
    • The bench.php script in the PHP source tree
    • A rather average laptop
    • 10 runs per version, then averaged

    View Slide

  14. PHP Versions Speed Comparison

    View Slide

  15. PHP Versions Speed Comparison

    View Slide

  16. PHP Versions Speed Comparison

    View Slide

  17. PHP Versions Speed Comparison

    View Slide

  18. Traits

    View Slide

  19. Traits
    Re-usable groups of methods, in languages with single inheritance.
    • Declare a trait, it looks like a class
    • Add the trait to your class using the use keyword
    • Methods are available!

    View Slide

  20. Trait Example From ZF2
    namespace Zend\EventManager;
    trait ProvidesEvents
    {
    public function setEventManager(EventManagerInterface $events)
    {
    $identifiers = array(__CLASS__, get_called_class());
    $events->setIdentifiers($identifiers);
    $this->events = $events;
    return $this;
    }
    public function getEventManager()
    {
    if (!$this->events instanceof EventManagerInterface) {
    $this->setEventManager(new EventManager());
    }
    return $this->events;
    }
    }

    View Slide

  21. Using Traits
    Apply it like this:
    class Magic {
    use \Zend\EventManager\ProvidesEvents;
    // more magical things
    }
    $magic = new Magic();
    $magic->setEventManager(new FancyEventManager());

    View Slide

  22. Other Trait Trivia
    • They can be aliased when used

    View Slide

  23. Other Trait Trivia
    • They can be aliased when used
    • There are rules about resolving naming clashes

    View Slide

  24. Other Trait Trivia
    • They can be aliased when used
    • There are rules about resolving naming clashes
    • Traits can include properties

    View Slide

  25. Other Trait Trivia
    • They can be aliased when used
    • There are rules about resolving naming clashes
    • Traits can include properties
    • Traits can include abstract methods

    View Slide

  26. Other Trait Trivia
    • They can be aliased when used
    • There are rules about resolving naming clashes
    • Traits can include properties
    • Traits can include abstract methods
    • Traits can themselves make use of other traits

    View Slide

  27. Built In Webserver

    View Slide

  28. Built In Webserver
    Built in application server for PHP 5.4
    • Simple
    • Lightweight
    • Development use only
    From the manual: "Requests are served sequentially."
    http://lrnja.net/NQoXsh

    View Slide

  29. Webserver Examples
    Start a simple server on a port number of your choice
    php -S localhost:8080
    http://localhost:8080

    View Slide

  30. Webserver Examples
    Change the hostname:
    php -S dev.project.local:8080
    http://dev.project.local:8080

    View Slide

  31. Webserver Examples
    Specify the docroot
    php -S localhost:8080 -t /var/www/superproject
    Specify which php.ini to use (default: none)
    php -S localhost:8080 -c php.ini-development

    View Slide

  32. Webserver Examples
    Use a routing file (example from http://lrnja.net/LigI4U)
    if (file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    return false; // serve the requested resource as-is
    } else {
    include_once 'index.php';
    }
    routing.php
    php -S localhost:8080 routing.php
    The webserver runs routing.php before entering the requested script.
    This example serves any existing resource, or routes to index.php

    View Slide

  33. Session Upload Progress

    View Slide

  34. Session Upload Progress
    File upload progress, written to the session at intervals
    Useful for user feedback, e.g. shiny new HTML5 progress bars!

    View Slide

  35. Tracking Upload Progress
    User starts uploading file in the usual way

    ?>" value="123" />
    File:


    View Slide

  36. Tracking Upload Progress
    In a separate file, we can check the relevant session variables to see how
    the upload is going: http://lrnja.net/Lhs7jJ
    array(1) {
    ["upload_progress_123"]=>
    array(5) {
    ["start_time"]=>
    int(1340542011)
    ["content_length"]=>
    int(1529158981)
    ["bytes_processed"]=>
    int(1386660589)
    ["done"]=>
    bool(false)
    ["files"]=>
    array(1) {
    [0]=>
    array(7) {
    ...
    }
    }
    }
    }

    View Slide

  37. Anonymous Functions, __invoke and
    the Callable Typehint

    View Slide

  38. Typehinting
    We can typehint in PHP, on:
    • Classes
    • Interfaces
    • Arrays

    View Slide

  39. Typehinting
    We can typehint in PHP, on:
    • Classes
    • Interfaces
    • Arrays
    • ... and now Callable
    Callable denotes anything that can be called - e.g. a closure, callback or
    invokable object

    View Slide

  40. Anonymous Functions
    • Literally functions with no name
    • More convenient than create_function()
    Example:
    $ping = function() {
    echo "ping!";
    };
    $ping(); // ping!

    View Slide

  41. Callable Examples
    function sparkles(Callable $func) {
    $func();
    return "fairy dust";
    }
    $ping = function() {
    echo "ping!";
    };
    $pong = "pong";
    echo sparkles($ping); // ping!fairy dust
    echo sparkles($pong);
    Catchable fatal error: Argument 1 passed to sparkles() must be
    callable, string given, called in /home/lorna/.../callable.php on
    line 16 and defined in /home/lorna/.../callable.php on line 10

    View Slide

  42. Callable Examples
    function sparkles(Callable $func) {
    $func();
    return "fairy dust";
    }
    class Butterfly {
    public function __invoke() {
    echo "flutter";
    }
    }
    $bee = new Butterfly();
    echo sparkles($bee); // flutterfairy dust

    View Slide

  43. JsonSerializable

    View Slide

  44. Sleep and Wakeup
    When we serialize() or unserialize() an object, PHP provides
    "magic methods" for us to hook into (this isn’t new):
    • __sleep() to specify which fields should be serialized
    • __wakeup() to perform any operations needed to complete an
    object when it is unserialized
    This gives us the same feature for when we JSON something

    View Slide

  45. The JsonSerializable Interface
    From the manual:
    JsonSerializable {
    abstract public mixed jsonSerialize ()
    }
    Objects implementing the JsonSerializable interface can control how
    they are represented in JSON when they are passed to json_encode()

    View Slide

  46. JsonSerializable Example
    class gardenObject implements JsonSerializable
    {
    public function jsonSerialize() {
    $data = $this;
    unset($data->herbs);
    return $data;
    }
    }
    $garden = new gardenObject();
    $garden->flowers = array("clematis", "geranium", "hydrangea");
    $garden->herbs = array("mint", "sage", "chives", "rosemary");
    $garden->fruit = array("apple", "rhubarb");
    echo json_encode($garden);
    {"flowers":["clematis","geranium","hydrangea"],"fruit"
    :["apple","rhubarb"]}

    View Slide

  47. No More Nonsense

    View Slide

  48. Removed Features
    • register_globals
    • register_long_arrays
    • safe_mode
    • magic_quotes
    • allow_call_time_pass_reference
    • y2k_compliance
    • ereg* functions

    View Slide

  49. Upgrading to PHP 5.4
    • Turn on E_DEPRECATED in PHP 5.3
    • Warns when you use features which are gone in 5.4
    • Test with the PHP 5.4 webserver

    View Slide

  50. PHP 5.4

    View Slide

  51. Did I Mention it’s Faster?

    View Slide

  52. The PHP 5.4 Features I’ll Actually Use
    • Short array syntax
    • Traits
    • Built in webserver
    • Upload progress
    • Callable
    • JsonSerializable

    View Slide

  53. Questions?

    View Slide

  54. Resources
    All in a single bundle for you: http://lrnja.net/KOouXv

    View Slide

  55. Thanks!
    https://joind.in/7019
    @lornajane
    http://lornajane.net

    View Slide