Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP 5.3 Overview

E4df4a30f000a225df7114e4940944e7?s=47 jakefolio
September 26, 2011

PHP 5.3 Overview

Still using PHP 4, I hope not, or you're still teetering on the thought of moving to PHP 5.3.x? Jake Smith will introduce you to new functionality, features and performance increases in PHP 5.3. Here is just a few of the things that will be covered: Namespaces, Anonymous Functions and Late Static Binding.

E4df4a30f000a225df7114e4940944e7?s=128

jakefolio

September 26, 2011
Tweet

More Decks by jakefolio

Other Decks in Programming

Transcript

  1. PHP 5.3 OVERVIEW 6/8/2010 - Dallas PHP Jake Smith

  2. PERFORMANCE • Over 140 bug fixes • 40%+ improvement with

    PHP on Windows • 5% - 15% overall performance improvement • MD5 roughly 15% faster • Constants move to read-only memory • Drupal 20% faster, Wordpress 15% faster
  3. ADDITIONS • New error_reporting E_DEPRECATED • Garbage collection • MySQLnd

    (Native Driver) • No longer uses libmysql • No PDO support (currently) • MySQL version 4.1+
  4. BACKWARDS COMPATIBILITY • EREG Family is now E_DEPRECATED • Use

    the Pearl Compatible (PCRE) • __toString does not accept arguments/parameters • Magic methods must be public and can not be static • __call is now invoked on access to private/protected methods • Classes can not be named Namespace or Closure SOURCES: http://us2.php.net/manual/en/migration53.incompatible.php
  5. MAGIC METHODS IN 5.3 <?php class Backwards { public function

    __call($method, $value) { echo "Call Magic Method<br />\n"; } private function __get($method) { } private function __set($method, $value) { } private function getElements() { echo "Get Elements<br />\n"; } } $bc = new Backwards(); $bc->getElements();
  6. CHANGES IN PHP.INI • INI Variables • Per Folder/Per Site

    ini settings • User specified ini files
  7. .INI VARIABLES error_dev = E_ALL error_prod = E_NONE [HOST=dev.mydomain.com] error_reporting

    = ${error_dev} [HOST=mydomain.com] error_reporting = ${error_prod} [PATH=/var/www/vhosts/myotherdomain.com] error_reporting = ${error_prod} # User Defined ini. Place in web root. Set to blank to disable user_ini.filename = .user.ini user_ini.cache_ttl = 300
  8. SLOW ADOPTION • Open Source projects were initially not compatible

    with PHP 5.3 • Currently most major Open Source software (Wordpress, Drupal, Joomla and Magento) work in PHP 5.3 • Key plugins are lacking behind
  9. PECL ADDITIONS • PECL Added • FileInfo, Intl, Phar, MySQLnd,

    SQLite3 • PECL Removed • ncurses, FPDF, dbase, fbsql, ming SOURCES: http://php.net/releases/5_3_0.php
  10. SPL ADDITIONS • GlobIterator - Iterator utilizing glob, look up

    glob function • SplFixedArray - Fixed size/dimension array • SplQueue • SplHeap • SplStack SOURCES: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
  11. NEW CONSTANTS • __DIR__ • No more dirname(__FILE__); • __NAMESPACE__

    • Current namespace
  12. NEW OPERATORS • Ternary Operator ?: • Goto • NOWDOC

  13. TERNARY OPERATOR <?php // Before PHP 5.3 $action = $_POST['action']

    ? $_POST['action'] : 'Default Action'; // Now in PHP 5.3 (less time) $action = $_POST['action'] ?: 'Default Action';
  14. GOTO SOURCES: http://xkcd.com/292/

  15. GOTO EXAMPLE <?php for($i=0,$j=50; $i<100; $i++) { while($j--) { if($j==17)

    goto end; } } echo "i = $i"; end: // End echo 'j hit 17'; SOURCES: http://php.net/manual/en/control-structures.goto.php
  16. NOWDOC VS. HEREDOC • NOWDOC works just like HEREDOC, except

    it does not evaluate PHP variables <?php $myVar = 'testing'; // OUTPUT: Here is my text testing $longString = <<<HEREDOC Here is my text $myVar HEREDOC; // OUTPUT: Here is my text $myVar $longString = <<<'NOWDOC' Here is my text $myVar 'NOWDOC';
  17. DATE/TIME OBJECT ADDITIONS • New functions/methods added to Date/Time Object

    • date_add, date_sub and date_diff SOURCES: http://www.php.net/manual/en/class.datetime.php <?php $date = new DateTime('2000-01-01'); $date->add(new DateInterval('P10D')); echo $date->format('Y-m-d') . "\n"; // OR $date = date_create('200-01-01'); date_add($date, date_interval_create_from_date_string('10 days')); echo date_format($date, 'Y-m-d');
  18. NEW METHODS • Functors/__invoke • Dynamic Static Method • __callStatic

    • get_called_class()
  19. __INVOKE <?php class Functor { public function __invoke($param = null)

    { return 'Hello Param: ' . $param; } } $func = new Functor(); echo $func('PHP 5.3'); // Hello Param: PHP 5.3
  20. DYNAMIC STATIC METHOD <?php abstract class Model { const TABLE_NAME

    = ''; public static function __call($method, $params) { // Run logic return $this->$method($criteria, $order, $limit, $offset); } }
  21. DYNAMIC STATIC METHOD <?php abstract class Model { const TABLE_NAME

    = ''; public static function __callStatic($method, $params) { // Run logic return static::$method($criteria, $order, $limit, $offset); } }
  22. __CALLSTATIC • __callStatic works exactly like __call, except it’s a

    static method • Acts as a catch all for all undefined methods (get or set) <?php abstract class Model { const TABLE_NAME = ''; public static function __callStatic($method, $params) { // Run logic return static::$method($criteria, $order, $limit, $offset); } }
  23. GET_CLASS_CALLED • get_called_class returns the class name that called on

    the parent method
  24. GET_CLASS_CALLED <?php namespace App { abstract class Model { public

    static function __callStatic($method, $params) { // Search Logic $method = $matches[1]; return static::$method($criteria, $order, $limit, $offset); } public static function find($criteria = array(), $order = null, $limit = null, $offset = 0) { $tableName = strtolower(get_class_called()); // get_class_called will return Post } } } namespace App\Models { class Post extends \App\Model {} } // Returns all the posts that contain Dallas PHP in the title $posts = Post::findByTitle('Dallas PHP'); ?>
  25. LATE STATIC BINDING • This feature was named "late static

    bindings" with an internal perspective in mind. "Late binding" comes from the fact that static:: will no longer be resolved using the class where the method is defined but it will rather be computed using runtime information. SOURCES: http://us.php.net/lsb
  26. LSB BEFORE PHP 5.3 <?php class Model { const TABLE_NAME

    = ''; public static function getTable() { return self::TABLE_NAME; } } class Author extends Model { const TABLE_NAME = 'Author'; } class Post extends Model { const TABLE_NAME = 'Post' } // sadly you get nothing echo Post::TABLE_NAME;
  27. LSB PHP 5.3.X • static keyword to save the day!

    <?php class Model { const TABLE_NAME = ''; public static function getTable() { return static::TABLE_NAME; } } class Author extends Model { const TABLE_NAME = 'Author'; } class Post extends Model { const TABLE_NAME = 'Post' } // sadly you get nothing echo Post::TABLE_NAME;
  28. LAMBDA IN PHP 5.3 • Anonymous functions, also known as

    closures, allow the creation of functions which have no specified name. They are most useful as the value of callback parameters, but they have many other uses. • Good function examples: array_map() and array_walk() <?php $string = 'Testing'; $array = array('hello', 'world', 'trying', 'PHP 5.3'); $return = array_walk($array, function($v,$k) { echo ucwords($v); });
  29. LAMBDA EXAMPLE (JQUERY) $('.button').click(function() { $(this).hide(); });

  30. CLOSURE <?php // Cycle factory: takes a series of arguments

    // for the closure to cycle over. function getRowColor (array $colors) { $i = 0; $max = count($colors); $colors = array_values($colors); $color = function() use (&$i, $max, $colors) { $color = $colors[$i]; $i = ($i + 1) % $max; return $color; }; return $color; } $rowColor = getRowColor(array('#FFF', '#F00', '#000')); echo $rowColor() . '<br />'; echo $rowColor() . '<br />'; echo $rowColor() . '<br />'; echo $rowColor() . '<br />'; echo $rowColor() . '<br />'; echo $rowColor() . '<br />';
  31. NAMESPACES • Before PHP 5.3 • PHP didn’t have namespaces,

    so we created a standard: “Zend_Auth_Adapter_DbTable” • PEAR naming convention • Easier for autoloaders
  32. DEFINING A NAMESPACE <?php namespace MyApp\Util; class String { public

    function formatPhone($phone) { // Regex phone number return true; } }
  33. “USE” A NAMESPACE <?php use MyApp\Util\String as String; $str =

    new String(); if ($str->formatPhone('123-456-7890')) { echo 'ITS TRUE'; }
  34. DEFINING MULTIPLE NAMESPACES <?php use Framework\Controller as BaseController use Framework\Model

    as BaseModel namespace MyApp\Controllers; class UsersController extends BaseController { } namespace MyApp\UserModel; class User extends BaseModel { } <?php use Framework\Controller as BaseController use Framework\Model as BaseModel namespace MyApp\Controllers { class UsersController extends BaseController { } } namespace MyApp\UserModel { class User extends BaseModel { } } One Way Preferred Way!
  35. WHAT IS GLOBAL SCOPE? • Global Scope is your “root

    level” outside of the namespace <?php namespace Framework; class DB { public function getConnection() { try { $dbh = new \PDO('mysql:dbname=testdb;host=localhost', 'root', 'pass'); } catch (\Exception $e) { echo 'Default Exception'; } } } $db = new DB(); $db = $db->getConnection();
  36. ORM EXAMPLE <?php namespace App { abstract class Model {

    const TABLE_NAME = ''; public static function __callStatic($method, $params) { if (!preg_match('/^(find|findFirst|count)By(\w+)$/', $method, $matches)) { throw new \Exception("Call to undefined method {$method}"); } echo preg_replace('/([a-z0-9])([A-Z])/', '$1_$2', $matches[2]); $criteriaKeys = explode('_And_', preg_replace('/([a-z0-9])([A-Z])/', '$1_$2', $matches[2])); print_r($matches); $criteriaKeys = array_map('strtolower', $criteriaKeys); $criteriaValues = array_slice($params, 0, count($criteriaKeys)); $criteria = array_combine($criteriaKeys, $criteriaValues); $params = array_slice($params, count($criteriaKeys)); if (count($params) > 0) { list($order, $limit, $offset) = $params; } $method = $matches[1]; return static::$method($criteria, $order, $limit, $offset); } public static function find($criteria = array(), $order = null, $limit = null, $offset = 0) { echo static::TABLE_NAME; echo $order . ' ' . $limit . ' ' . $offset; } } } namespace App\Models { class Posts extends \App\Model { const TABLE_NAME = 'posts'; } }
  37. QUESTIONS?

  38. THANKS FOR LISTENING Contact Information [t]: @jakefolio [e]: jake@dallasphp.org [w]:

    http://www.jakefolio.com