Successfully reported this slideshow.
Your SlideShare is downloading. ×

Can't Miss Features of PHP 5.3 and 5.4

Can't Miss Features of PHP 5.3 and 5.4

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.

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.

More Related Content

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Can't Miss Features of PHP 5.3 and 5.4

  1. 1. Can’t Miss Features of PHP 5.3 and 5.4 Jeff Carouth BCSPHP Sept. 15, 2011 1
  2. 2. Hi! I am Jeff Senior Developer at Texas A&M Author of several magazine articles (php|architect) Infrequent (lazy) blogger at carouth.com Lover 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 improvements Closures / anonymous functions / lambda functions Namespaces 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 Improvements SPLFixedArray SPLDoublyLinkedList SPLStack and SPLQueue SPLHeap, SPLMinHeap, SPLMaxHeap SPLPriorityQueue 8
  9. 9. We have shiny new data structures. 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 all anonymous 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 Lambdas array_walk, array_map, array_reduce usort, uasort array_filter preg_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 criteria define('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 PRACTICAL Caching. 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. Functors Because 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. Namespaces All the cool languages have them. or perhaps PHP just wants to be JAVA with all its package glory after all, we do have PHARs 29
  30. 30. Nope. Namespaces solve a real need. 30
  31. 31. The “” Separator 31
  32. 32. Namespace Benefits Organization. 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 organization In /path/to/Tamu.php: namespace Tamu; In /path/to/Tamu/Dmc.php namespace TamuDmc; In /path/to/Tamu/Auth/Adapter/Cas.php namespace TamuAuthAdapter; class Cas { } 34
  35. 35. Conflict Resolution namespace My; function str_split($string, $split_len = 2) { return "Nope. I don't like to split strings."; } $splitstr = str_split('The quick brown fox'); // $splitstr = "Nope. I don't like to split strings." $splitstr = str_split('The quick brown fox'); // $splitstr = array('T', 'h', 'e', ..., 'o', 'x'); 35
  36. 36. Class name shortening class Zend_Application_Resource_Cachemanager extends Zend_Application_Resource_ResourceAbstract { //... } namespace ZendApplicationResource; class Cachemanager extends ResourceAbstract { //... } 36
  37. 37. Readability by Namespace require_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.4 alpha3 was used for demos beta going to be packaged on Sep 14 (source:php-internals) 39
  40. 40. New Features Closures support $this keyword Short Array Syntax Array Dereferencing Traits (Debug webserver) 40
  41. 41. Closures and $this class 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.4 Fatal error: Using $this when not in object context in / Users/jcarouth/Documents/code-bcsphp-092011/ php54closurethis.php on line 14 PHP 5.4.0alpha3 (built Aug 5, 2011) Hello, BCSPHP! 42
  43. 43. Short Array Syntax Saving you a few keystrokes and compute cycles when switching from JavaScript 43
  44. 44. Really, who doesn’t love JavaScript 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.3 if ($store->getDataForJeff()['isAdmin']) { //shorter...but be mindful } 48 PHP >= 5.4
  49. 49. Pitfalls Dereferencing a non-existent key produces a NOTICE. If the function does not return an array, unexpected behavior. 49
  50. 50. Traits! 50
  51. 51. Definition Traits is a mechanism for code reuse in single inheritance languages such as PHP. A Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies. The semantics of the combination of Traits and classes is defined in a way, which reduces complexity and avoids the typical problems associated with multiple inheritance and Mixins. 51
  52. 52. A bit much to take in The important bit is traits allow developers like you to increase code reuse and get around 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 compiler assisted copy and paste.” - Stefan Marr, PHP Internals Mailing List, Nov 2010 59
  60. 60. Built-in Development Server 60
  61. 61. DEMO php -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.net Run make test TEST YOUR APPS against PHP 5.4-alpha/beta/RC 63
  64. 64. That’s all folks! QUESTIONS? @jcarouth jcarouth@gmail.com jeffcarouth.info 64
  65. 65. Have feedback? http://joind.in/3716 65
  66. 66. Resources Enygma’s PHP 5.3 example code http://bit.ly/q9Eu36 Elazar’s benchmarks of SPL features in PHP 5.3 http://bit.ly/nKsbvQ PHP documentation on the built-in web server http://bit.ly/rc26l0 66

Editor's Notes

  • \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&amp;#x2019;t a terribly intriguing use case, so let&amp;#x2019;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

×