Can’t Miss Features of    PHP 5.3 and 5.4Jeff Carouth       BCSPHP Sept. 15, 2011               1
Hi! I am JeffSenior Developer at Texas A&MAuthor of several magazine articles (php|architect)Infrequent (lazy) blogger at ...
About you?New to PHP?Using PHP 5.3?Used PHP yesterday? this afternoon?                     3
PHP 5.3   4
What’s all the hubbub?__DIR__SPL improvementsClosures / anonymous functions / lambda functionsNamespaces                  ...
__DIR__“under under durrr”         6
__DIR__ usefulness   Cleanup autoloading code.   That’s about it.include_once dirname(__FILE__) . "/../myfile.php";include...
SPL ImprovementsSPLFixedArraySPLDoublyLinkedListSPLStack and SPLQueueSPLHeap, SPLMinHeap, SPLMaxHeapSPLPriorityQueue      ...
We have shiny new datastructures. Use them instead of   arrays where appropriate!               9
Closures   10
The PHP folk are trying to     confuse you…            11
...because not allanonymous functions are        closures...           12
…which aren’t the same as lambda expressions or       functors.            13
You say semantics? No.        There is a difference.(But I’ll step off my soapbox for now. Feel free to ping              ...
function() {    print Hello;};$myhello = function() {    print "Hello!";};$myhello();$myhelloname = function($name) {    p...
function get_closure($name) {    $person = new stdclass();    $person->name = $name;      return function() use($person) {...
Using Lambdasarray_walk, array_map, array_reduceusort, uasortarray_filterpreg_replace_callback                17
$fabrics= array(    array(color   =>   blue),    array(color   =>   red),    array(color   =>   green),    array(color   =...
// filter based on dynamic criteriadefine(MINUTE, 60);define(HOUR, 3600);define(DAY, 86400);define(WEEK, 604800);$accounts...
$results = array();$oneweek = time()-WEEK;foreach ($accounts as $account) {    if ($account[lastActivity] > $oneweek) {   ...
$getfilterfunc = function($lower, $upper = 0) {    $lowerTime = time() - $lower;    $upperTime = time() - $upper;    retur...
BOOM!22
MOAR PRACTICALCaching.Typically you have a load() and save()method.Perhaps even a load(), start(), and end()method.       ...
class SimpleCache {    private $_data = array();    public function load($key) {        if (!array_key_exists($key, $this-...
class SimpleCacheWithClosures {    protected $_data = array();    public function load($key, $callback) {        if (!arra...
FunctorsBecause the rest just wasn’t enough…                 26
Functors, in simple terms,are objects that you can call  as if they are functions.              27
class Send {    private function _broadcast() {        return Message sent.;    }    public function __invoke() {        r...
NamespacesAll the cool languages have them.or perhaps PHP just wants to be JAVAwith all its package gloryafter all, we do ...
Nope. Namespaces solve a       real need.           30
The “” Separator        31
Namespace BenefitsOrganization. Both file and code.Reduce conflicts with other libraries.Shorten class names.Readability.    ...
define("LIBRARYDIR", __DIR__);class Tamu_Cas_Adapter {    function auth() { }}function tamu_cas_create_client() {    retur...
Namespace organizationIn /path/to/Tamu.php:namespace Tamu;In /path/to/Tamu/Dmc.phpnamespace TamuDmc;In /path/to/Tamu/Auth/...
Conflict Resolutionnamespace My;function str_split($string, $split_len = 2) {    return "Nope. I dont like to split strings...
Class name shorteningclass Zend_Application_Resource_Cachemanager    extends Zend_Application_Resource_ResourceAbstract{  ...
Readability by Namespacerequire_once "Zend/Http/Client.php";$client = new Zend_Http_Client();use ZendHttp;$client = new Cl...
Take a deep breath        38
PHP 5.4alpha3 was used for demosbeta going to be packaged on Sep 14(source:php-internals)                     39
New FeaturesClosures support $this keywordShort Array SyntaxArray DereferencingTraits(Debug webserver)                40
Closures and $thisclass HelloWorldPrinter{    public function __construct($name) {        $this->_name = $name;    }    pu...
Prior to PHP 5.4Fatal error: Using $this when not in object context in /Users/jcarouth/Documents/code-bcsphp-092011/php54c...
Short Array Syntax          Saving you a few keystrokesand compute cycles when switching from JavaScript                  ...
Really, who doesn’t loveJavaScript array syntax?           44
//empty array$arr = [];//simple array$arr = [1, 2, 3];//"dictionary" array$arr = [name => jeff, language => php];//multi-d...
Array Dereferencing         46
$array = array(1, 2, 3);$dereference = *$array;                   Sorry, no pointers.    All the upset C++ wizards, go hav...
class UserDataSource{    public function getDataForJeff()    {        return [            id => 1,            name => Jeff...
PitfallsDereferencing a non-existent key produces aNOTICE.If the function does not return an array,unexpected behavior.   ...
Traits!   50
DefinitionTraits is a mechanism for code reuse in singleinheritance languages such as PHP. A Trait isintended to reduce som...
A bit much to      take inThe important bit is traitsallow developers like you toincrease code reuse and getaround limitat...
Show me the code!trait Named {    function name() {        //function body    }}                          53
class SearchController {    public function findBook(Book $b) { }    private function log($message) {        error_log($me...
trait Logging {    private function log($message) {        error_log($message);    }}class SearchController {    use Loggi...
namespace TamuTimesModels;class Story {    public function setDataStore($store) {        $this->_ds = $store;    }    publ...
namespace TamuDmcApp;trait DataStore {    public function setDataStore($store) {        $this->_ds = $store;    }    publi...
namespace BCSPHP;trait MessageBroadcast {    public function sendMessage() { }    abstract private function _formatMessage...
Traits are “just compilerassisted copy and paste.”      - Stefan Marr, PHP Internals Mailing List, Nov 2010               ...
Built-in Development Server             60
DEMOphp -S 0.0.0.0:8080 -t /path/to/docroot                        61
Caveat       Routing must be handled with a separate       router.php script.if (file_exists(__DIR__ . / . $_SERVER[REQUES...
What you can do now:(more like what you should do)Test PHP 5.4 — http://qa.php.netRun    make testTEST YOUR APPS against P...
That’s all folks!QUESTIONS?@jcarouthjcarouth@gmail.comjeffcarouth.info                     64
Have feedback?http://joind.in/3716          65
ResourcesEnygma’s PHP 5.3 example codehttp://bit.ly/q9Eu36Elazar’s benchmarks of SPL features in PHP 5.3http://bit.ly/nKsb...
Upcoming SlideShare
Loading in …5
×

Can't Miss Features of PHP 5.3 and 5.4

4,811 views
4,741 views

Published on

If you're like me you remember the days of PHP3 and PHP4; you remember when PHP5 was released, and how it was touted to change to your life. It's still changing and there are some features of PHP 5.3 and new ones coming with PHP 5.4 that will improve your code readability and reusability. Let's look at some touted features such as closures, namespaces, and traits, as well as some features being discussed for future releases.

Published in: Technology
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,811
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • PHP 5.3.0 released June 30, 2009.\nBugfixes and security patches in 5.3.1-5.3.6 (11/2009-3/2011)\n5.3.7 released on Aug. 18, 2011. focused on improving stability\n5.3.8 released shortly after (Aug 23) to fix two issues introduced in .7\n
  • Listed in an ascending level of interesting-ness.\nMagic Constants: LINE, FILE, DIR, FUNCTION, CLASS, METHOD, NAMESPACE\nStandard PHP Library\n
  • \n
  • __DIR__ does not include a trailing space\n
  • Sometimes marginal differences in throughput (execs/sec), but memory consumption is generally lower with respect to dataset size (num elements)\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • This isn’t a terribly intriguing use case, so let’s look at a more practical example.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Cannot do use(new Obj() as $s) :-(\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Just get over it. Embrace the backslash.\n
  • Organize OO code into self-contained units.\nEver heard of the global namespace pollution issue?\nPEAR naming convention\nImports and aliases.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Before 5.4 you cannot refer to the object instance that created the closure.\nEXAMPLE\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Can't Miss Features of PHP 5.3 and 5.4

    1. 1. Can’t Miss Features of PHP 5.3 and 5.4Jeff Carouth BCSPHP Sept. 15, 2011 1
    2. 2. Hi! I am JeffSenior Developer at Texas A&MAuthor of several magazine articles (php|architect)Infrequent (lazy) blogger at carouth.comLover of progress, innovation, and improvement.Developing with PHP since ~2003 2
    3. 3. About you?New to PHP?Using PHP 5.3?Used PHP yesterday? this afternoon? 3
    4. 4. PHP 5.3 4
    5. 5. What’s all the hubbub?__DIR__SPL improvementsClosures / anonymous functions / lambda functionsNamespaces 5
    6. 6. __DIR__“under under durrr” 6
    7. 7. __DIR__ usefulness Cleanup autoloading code. That’s about it.include_once dirname(__FILE__) . "/../myfile.php";include_once __DIR__ . "/../myfile.php"; 7
    8. 8. SPL ImprovementsSPLFixedArraySPLDoublyLinkedListSPLStack and SPLQueueSPLHeap, SPLMinHeap, SPLMaxHeapSPLPriorityQueue 8
    9. 9. We have shiny new datastructures. Use them instead of arrays where appropriate! 9
    10. 10. Closures 10
    11. 11. The PHP folk are trying to confuse you… 11
    12. 12. ...because not allanonymous functions are closures... 12
    13. 13. …which aren’t the same as lambda expressions or functors. 13
    14. 14. You say semantics? No. There is a difference.(But I’ll step off my soapbox for now. Feel free to ping me later.) 14
    15. 15. function() { print Hello;};$myhello = function() { print "Hello!";};$myhello();$myhelloname = function($name) { print "Hello, " . $name . "!";};$myhelloname(BCSPHP); 15
    16. 16. function get_closure($name) { $person = new stdclass(); $person->name = $name; return function() use($person) { print "Hello, " . $person->name . "!"; };}$myhelloclosure = get_closure(Gernonimo);$myhelloClosure();// Output: "Hello, Geronimo!" $myhelloclosure is said to “close over” the $person variable which is within its defined scope. 16
    17. 17. Using Lambdasarray_walk, array_map, array_reduceusort, uasortarray_filterpreg_replace_callback 17
    18. 18. $fabrics= array( array(color => blue), array(color => red), array(color => green), array(color => maroon));usort($fabrics, function($a, $b) { return strcmp($a[color], $b[color]);}); 18
    19. 19. // filter based on dynamic criteriadefine(MINUTE, 60);define(HOUR, 3600);define(DAY, 86400);define(WEEK, 604800);$accounts = array( array(id => 1, lastActivity => time()-2*WEEK), array(id => 2, lastActivity => time()-3*DAY), array(id => 3, lastActivity => time()-45*MINUTE), array(id => 4, lastActivity => time()-2*HOUR-5*MINUTE), array(id => 5, lastActivity => time()-5), array(id => 6, lastActivity => time()-3*MINUTE-20), array(id => 7, lastActivity => time()-2*WEEK-3*DAY), array(id => 8, lastActivity => time()-HOUR-33*MINUTE), array(id => 9, lastActivity => time()-5*MINUTE),); 19
    20. 20. $results = array();$oneweek = time()-WEEK;foreach ($accounts as $account) { if ($account[lastActivity] > $oneweek) { $results[] = $account; }}$results = array_filter( $accounts, function($account) { return $account[lastActivity] > time()-WEEK; }); 20
    21. 21. $getfilterfunc = function($lower, $upper = 0) { $lowerTime = time() - $lower; $upperTime = time() - $upper; return function($account) use($lowerTime, $upperTime) { return $account[lastActivity] >= $lowerTime && $account[lastActivity] <= $upperTime; }}$pastWeekResults = array_filter( $accounts, $getfilterfunc(WEEK));$previousWeekResults = array_filter( $accounts, $getFilterFunc(2*WEEK, WEEK)); 21
    22. 22. BOOM!22
    23. 23. MOAR PRACTICALCaching.Typically you have a load() and save()method.Perhaps even a load(), start(), and end()method. 23
    24. 24. class SimpleCache { private $_data = array(); public function load($key) { if (!array_key_exists($key, $this->_data)) { return false; } return $this->_data[$key]; } public function save($key, $data) { $this->_data[$key] = $data; }}$cache = new SimpleCache();if (($data = $cache->load(‘alltags’)) === false) { $service = new ExpensiveLookupClass(); $data = $service->findAllTags(); $cache->save(‘alltags’, $data);} 24
    25. 25. class SimpleCacheWithClosures { protected $_data = array(); public function load($key, $callback) { if (!array_key_exists($key, $this->_data)) { $this->_data[$key] = $callback(); } return $this->_data[$key]; }}$cache = new SimpleCacheWithClosures();$service = new ExpensiveLookupClass();$data = $cache->load(alltags, function() use($service) { return $service->findAllTags();}); 25
    26. 26. FunctorsBecause the rest just wasn’t enough… 26
    27. 27. Functors, in simple terms,are objects that you can call as if they are functions. 27
    28. 28. class Send { private function _broadcast() { return Message sent.; } public function __invoke() { return $this->_broadcast(); }}$send = new Send();debug_log($send()); 28
    29. 29. NamespacesAll the cool languages have them.or perhaps PHP just wants to be JAVAwith all its package gloryafter all, we do have PHARs 29
    30. 30. Nope. Namespaces solve a real need. 30
    31. 31. The “” Separator 31
    32. 32. Namespace BenefitsOrganization. Both file and code.Reduce conflicts with other libraries.Shorten class names.Readability. 32
    33. 33. define("LIBRARYDIR", __DIR__);class Tamu_Cas_Adapter { function auth() { }}function tamu_cas_create_client() { return new Tamu_Http_Client();}namespace TamuCas;use TamuHttpClient as HttpClient;const LIBRARYDIR = __DIR__;class Adapter { function auth() { }}function create_client() { return new HttpClient();} 33
    34. 34. Namespace organizationIn /path/to/Tamu.php:namespace Tamu;In /path/to/Tamu/Dmc.phpnamespace TamuDmc;In /path/to/Tamu/Auth/Adapter/Cas.phpnamespace TamuAuthAdapter;class Cas { } 34
    35. 35. Conflict Resolutionnamespace My;function str_split($string, $split_len = 2) { return "Nope. I dont like to split strings.";}$splitstr = str_split(The quick brown fox);// $splitstr = "Nope. I dont like to split strings."$splitstr = str_split(The quick brown fox);// $splitstr = array(T, h, e, ..., o, x); 35
    36. 36. Class name shorteningclass Zend_Application_Resource_Cachemanager extends Zend_Application_Resource_ResourceAbstract{ //...}namespace ZendApplicationResource;class Cachemanager extends ResourceAbstract{ //...} 36
    37. 37. Readability by Namespacerequire_once "Zend/Http/Client.php";$client = new Zend_Http_Client();use ZendHttp;$client = new Client();use ZendHttpClient as HttpClient;$httpClient = new HttpClient(); 37
    38. 38. Take a deep breath 38
    39. 39. PHP 5.4alpha3 was used for demosbeta going to be packaged on Sep 14(source:php-internals) 39
    40. 40. New FeaturesClosures support $this keywordShort Array SyntaxArray DereferencingTraits(Debug webserver) 40
    41. 41. Closures and $thisclass HelloWorldPrinter{ public function __construct($name) { $this->_name = $name; } public function getPrinter() { return function() { return "Hello, " . $this->_name . "!"; }; }}$instance = new HelloWorldPrinter(BCSPHP);$printer = $instance->getPrinter();echo $printer(); 41
    42. 42. Prior to PHP 5.4Fatal error: Using $this when not in object context in /Users/jcarouth/Documents/code-bcsphp-092011/php54closurethis.php on line 14PHP 5.4.0alpha3 (built Aug 5, 2011)Hello, BCSPHP! 42
    43. 43. Short Array Syntax Saving you a few keystrokesand compute cycles when switching from JavaScript 43
    44. 44. Really, who doesn’t loveJavaScript array syntax? 44
    45. 45. //empty array$arr = [];//simple array$arr = [1, 2, 3];//"dictionary" array$arr = [name => jeff, language => php];//multi-dimensional$arr = [[orange, blue], [black, gold]]; 45
    46. 46. Array Dereferencing 46
    47. 47. $array = array(1, 2, 3);$dereference = *$array; Sorry, no pointers. All the upset C++ wizards, go have some pizza. 47
    48. 48. class UserDataSource{ public function getDataForJeff() { return [ id => 1, name => Jeff Carouth, isAdmin => true, ]; }}$jeff = $store->getDataForJeff();if ($jeff[isAdmin] === true) { //give him access to all the things} PHP <= 5.3if ($store->getDataForJeff()[isAdmin]) { //shorter...but be mindful} 48 PHP >= 5.4
    49. 49. PitfallsDereferencing a non-existent key produces aNOTICE.If the function does not return an array,unexpected behavior. 49
    50. 50. Traits! 50
    51. 51. DefinitionTraits is a mechanism for code reuse in singleinheritance languages such as PHP. A Trait isintended to reduce some limitations of singleinheritance by enabling a developer to reusesets of methods freely in several independentclasses living in different class hierarchies. Thesemantics of the combination of Traits andclasses is defined in a way, which reducescomplexity and avoids the typical problemsassociated with multiple inheritance and Mixins. 51
    52. 52. A bit much to take inThe important bit is traitsallow developers like you toincrease code reuse and getaround limitations of single-inheritance. 52
    53. 53. Show me the code!trait Named { function name() { //function body }} 53
    54. 54. class SearchController { public function findBook(Book $b) { } private function log($message) { error_log($message); }}class AdminController { public function grant(User $u, Privilege $p) { } private function log($message) { error_log($message); }} 54
    55. 55. trait Logging { private function log($message) { error_log($message); }}class SearchController { use Logging;}class AdminController { use Logging;} 55
    56. 56. namespace TamuTimesModels;class Story { public function setDataStore($store) { $this->_ds = $store; } public function getDataStore() { return $this->_ds; }}class User { public function setDataStore($store) { $this->_ds = $store; } public function getDataStore() { return $this->_ds; }} 56
    57. 57. namespace TamuDmcApp;trait DataStore { public function setDataStore($store) { $this->_ds = $store; } public function getDataStore() { return $this->_ds; }}namespace TamuTimesModels;use TamuDmcAppDataStore;class Story { use DataStore;}class User { use DataStore;} 57
    58. 58. namespace BCSPHP;trait MessageBroadcast { public function sendMessage() { } abstract private function _formatMessage();}class MeetingNotification { use MessageBroadcast; private function _formatMessage() { return "Notice: BCSPHP Meeting " . $this->_date; }} 58
    59. 59. Traits are “just compilerassisted copy and paste.” - Stefan Marr, PHP Internals Mailing List, Nov 2010 59
    60. 60. Built-in Development Server 60
    61. 61. DEMOphp -S 0.0.0.0:8080 -t /path/to/docroot 61
    62. 62. Caveat Routing must be handled with a separate router.php script.if (file_exists(__DIR__ . / . $_SERVER[REQUEST_URI])) { return false; // serve the requested resource as-is.} else { include_once index.php;}if (php_sapi_name() == cli-server) { /* route static assets and return false */} 62
    63. 63. What you can do now:(more like what you should do)Test PHP 5.4 — http://qa.php.netRun make testTEST YOUR APPS against PHP 5.4-alpha/beta/RC 63
    64. 64. That’s all folks!QUESTIONS?@jcarouthjcarouth@gmail.comjeffcarouth.info 64
    65. 65. Have feedback?http://joind.in/3716 65
    66. 66. ResourcesEnygma’s PHP 5.3 example codehttp://bit.ly/q9Eu36Elazar’s benchmarks of SPL features in PHP 5.3http://bit.ly/nKsbvQPHP documentation on the built-in web serverhttp://bit.ly/rc26l0 66

    ×