$30 off During Our Annual Pro Sale. View Details »

PHP 5.3 Overview

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.

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

    View Slide

  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

    View Slide

  3. ADDITIONS
    • New error_reporting E_DEPRECATED
    • Garbage collection
    • MySQLnd (Native Driver)
    • No longer uses libmysql
    • No PDO support (currently)
    • MySQL version 4.1+

    View Slide

  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

    View Slide

  5. MAGIC METHODS IN 5.3
    class Backwards {
    public function __call($method, $value) {
    echo "Call Magic Method
    \n";
    }
    private function __get($method) {
    }
    private function __set($method, $value) {
    }
    private function getElements() {
    echo "Get Elements
    \n";
    }
    }
    $bc = new Backwards();
    $bc->getElements();

    View Slide

  6. CHANGES IN PHP.INI
    • INI Variables
    • Per Folder/Per Site ini settings
    • User specified ini files

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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/

    View Slide

  11. NEW CONSTANTS
    • __DIR__
    • No more dirname(__FILE__);
    • __NAMESPACE__
    • Current namespace

    View Slide

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

    View Slide

  13. TERNARY OPERATOR
    // Before PHP 5.3
    $action = $_POST['action'] ? $_POST['action'] : 'Default Action';
    // Now in PHP 5.3 (less time)
    $action = $_POST['action'] ?: 'Default Action';

    View Slide

  14. GOTO
    SOURCES: http://xkcd.com/292/

    View Slide

  15. GOTO EXAMPLE
    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

    View Slide

  16. NOWDOC VS. HEREDOC
    • NOWDOC works just like HEREDOC, except it does not
    evaluate PHP variables
    $myVar = 'testing';
    // OUTPUT: Here is my text testing
    $longString = <<Here is my text $myVar
    HEREDOC;
    // OUTPUT: Here is my text $myVar
    $longString = <<<'NOWDOC'
    Here is my text $myVar
    'NOWDOC';

    View Slide

  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
    $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');

    View Slide

  18. NEW METHODS
    • Functors/__invoke
    • Dynamic Static Method
    • __callStatic
    • get_called_class()

    View Slide

  19. __INVOKE
    class Functor {
    public function __invoke($param = null)
    {
    return 'Hello Param: ' . $param;
    }
    }
    $func = new Functor();
    echo $func('PHP 5.3'); // Hello Param: PHP 5.3

    View Slide

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

    View Slide

  21. DYNAMIC STATIC METHOD
    abstract class Model
    {
    const TABLE_NAME = '';
    public static function __callStatic($method, $params)
    {
    // Run logic
    return static::$method($criteria, $order, $limit, $offset);
    }
    }

    View Slide

  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)
    abstract class Model
    {
    const TABLE_NAME = '';
    public static function __callStatic($method, $params)
    {
    // Run logic
    return static::$method($criteria, $order, $limit, $offset);
    }
    }

    View Slide

  23. GET_CLASS_CALLED
    • get_called_class returns the class name that called on the
    parent method

    View Slide

  24. GET_CLASS_CALLED
    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');
    ?>

    View Slide

  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

    View Slide

  26. LSB BEFORE PHP 5.3
    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;

    View Slide

  27. LSB PHP 5.3.X
    • static keyword to save the day!
    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;

    View Slide

  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()
    $string = 'Testing';
    $array = array('hello', 'world', 'trying', 'PHP 5.3');
    $return = array_walk($array, function($v,$k) {
    echo ucwords($v);
    });

    View Slide

  29. LAMBDA EXAMPLE (JQUERY)
    $('.button').click(function() {
    $(this).hide();
    });

    View Slide

  30. CLOSURE
    // 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() . '
    ';
    echo $rowColor() . '
    ';
    echo $rowColor() . '
    ';
    echo $rowColor() . '
    ';
    echo $rowColor() . '
    ';
    echo $rowColor() . '
    ';

    View Slide

  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

    View Slide

  32. DEFINING A NAMESPACE
    namespace MyApp\Util;
    class String
    {
    public function formatPhone($phone) {
    // Regex phone number
    return true;
    }
    }

    View Slide

  33. “USE” A NAMESPACE
    use MyApp\Util\String as String;
    $str = new String();
    if ($str->formatPhone('123-456-7890')) {
    echo 'ITS TRUE';
    }

    View Slide

  34. DEFINING MULTIPLE
    NAMESPACES
    use Framework\Controller as BaseController
    use Framework\Model as BaseModel
    namespace MyApp\Controllers;
    class UsersController extends BaseController
    {
    }
    namespace MyApp\UserModel;
    class User extends BaseModel
    {
    }
    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!

    View Slide

  35. WHAT IS GLOBAL SCOPE?
    • Global Scope is your “root level” outside of the namespace
    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();

    View Slide

  36. ORM EXAMPLE
    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';
    }
    }

    View Slide

  37. QUESTIONS?

    View Slide

  38. THANKS FOR LISTENING
    Contact Information
    [t]: @jakefolio
    [e]: [email protected]
    [w]: http://www.jakefolio.com

    View Slide