Share
Embed
Transcript
55 slides
-
About Me • Lorna Jane Mitchell • PHP Consultant/Developer •
Author of PHP Master • Twitter: @lornajane • Website: http://lornajane.net -
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 -
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); -
Array Syntax Or this: $game = array('stone', 'paper', 'scissors'); print_r($game);
$game = array(0 => 'stone', 1 => 'paper', 2 => 'scissors'); print_r($game); -
Array Syntax Now we can do: $game = ['scissors', 'stone',
'paper']; print_r($game); $game = [0 => 'scissors', 1 => 'stone', 2 => 'paper']; print_r($game); -
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; -
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 -
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! -
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; } } -
Using Traits Apply it like this: class Magic { use
\Zend\EventManager\ProvidesEvents; // more magical things } $magic = new Magic(); $magic->setEventManager(new FancyEventManager()); -
Other Trait Trivia • They can be aliased when used
• There are rules about resolving naming clashes -
Other Trait Trivia • They can be aliased when used
• There are rules about resolving naming clashes • Traits can include properties -
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 -
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 -
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 -
Webserver Examples Start a simple server on a port number
of your choice php -S localhost:8080 http://localhost:8080 -
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 -
Webserver Examples Use a routing file (example from http://lrnja.net/LigI4U) <?php
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 -
Session Upload Progress File upload progress, written to the session
at intervals Useful for user feedback, e.g. shiny new HTML5 progress bars! -
Tracking Upload Progress User starts uploading file in the usual
way <form name="upload" method="post" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" /> File: <input type="file" id="file1" name="file1" /> <input type="submit" value="start upload" /> </form> -
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) { ... } } } } -
Typehinting We can typehint in PHP, on: • Classes •
Interfaces • Arrays -
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 -
Anonymous Functions • Literally functions with no name • More
convenient than create_function() Example: $ping = function() { echo "ping!"; }; $ping(); // ping! -
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 -
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 -
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 -
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() -
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"]} -
Removed Features • register_globals • register_long_arrays • safe_mode • magic_quotes
• allow_call_time_pass_reference • y2k_compliance • ereg* functions -
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 -
The PHP 5.4 Features I’ll Actually Use • Short array
syntax • Traits • Built in webserver • Upload progress • Callable • JsonSerializable