Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Can't Miss Features of PHP 5.3 and 5.4

5,028 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
  • Be the first to comment

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

×