SlideShare a Scribd company logo
PHP 5.3 OVERVIEW
   6/8/2010 - Dallas PHP
         Jake Smith
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
ADDITIONS

• New   error_reporting E_DEPRECATED

• Garbage   collection

• MySQLnd    (Native Driver)

 • No   longer uses libmysql

 • No   PDO support (currently)

 • MySQL     version 4.1+
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
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();
CHANGES IN PHP.INI

• INI Variables

• Per   Folder/Per Site ini settings

• User   specified ini files
.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
SLOW ADOPTION

• Open    Source projects were initially not compatible with PHP
 5.3

• Currentlymost major Open Source software (Wordpress,
 Drupal, Joomla and Magento) work in PHP 5.3

• Key   plugins are lacking behind
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
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/
NEW CONSTANTS

• __DIR__

 • No   more dirname(__FILE__);

• __NAMESPACE__

 • Current   namespace
NEW OPERATORS

• Ternary   Operator ?:

• Goto

• NOWDOC
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';
GOTO




SOURCES: http://xkcd.com/292/
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
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';
DATE/TIME OBJECT
                      ADDITIONS
• New      functions/methods added to Date/Time Object

 • date_add, date_sub                     and date_diff
           <?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');


 SOURCES: http://www.php.net/manual/en/class.datetime.php
NEW METHODS

• Functors/__invoke

• Dynamic   Static Method

• __callStatic

• get_called_class()
__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
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);
       }
   }
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);
      }
  }
__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);
                 }
            }
GET_CLASS_CALLED

• get_called_class   returns the class name that called on the
 parent method
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 AppModels {
         class Post extends AppModel {}
     }

     // Returns all the posts that contain Dallas PHP in the title
     $posts = Post::findByTitle('Dallas PHP');
?>
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
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;
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;
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);
          });
LAMBDA EXAMPLE (JQUERY)


     $('.button').click(function() {
         $(this).hide();
     });
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 />';
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
DEFINING A NAMESPACE

<?php
    namespace MyAppUtil;
    class String
    {
        public function formatPhone($phone) {
            // Regex phone number
            return true;
        }
    }
“USE” A NAMESPACE

<?php
use MyAppUtilString as String;

    $str = new String();
    if ($str->formatPhone('123-456-7890')) {
        echo 'ITS TRUE';
    }
DEFINING MULTIPLE
                 NAMESPACES
One Way                                        Preferred Way!
<?php                                          <?php
use FrameworkController as BaseController     use FrameworkController as BaseController
use FrameworkModel as BaseModel               use FrameworkModel as BaseModel
namespace MyAppControllers;                   namespace MyAppControllers {

class UsersController extends BaseController       class UsersController extends
{                                                  BaseController
                                                   {
}
                                                   }
namespace MyAppUserModel;                     }
class User extends BaseModel
{                                              namespace MyAppUserModel {
                                                   class User extends BaseModel
}                                                  {

                                                   }
                                               }
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();
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 AppModels {
        class Posts extends AppModel
        {
            const TABLE_NAME = 'posts';
        }
    }
QUESTIONS?
THANKS FOR LISTENING
Contact Information
[t]: @jakefolio
[e]: jake@dallasphp.org
[w]: http://www.jakefolio.com

More Related Content

PDF
SPL: The Missing Link in Development
PDF
関西PHP勉強会 php5.4つまみぐい
PDF
Php Tutorials for Beginners
PPTX
Electrify your code with PHP Generators
KEY
Lithium Best
PDF
Redis for your boss 2.0
PPT
Intro to PHP
PDF
Redis for your boss
SPL: The Missing Link in Development
関西PHP勉強会 php5.4つまみぐい
Php Tutorials for Beginners
Electrify your code with PHP Generators
Lithium Best
Redis for your boss 2.0
Intro to PHP
Redis for your boss

What's hot (20)

PDF
PHP 良好實踐 (Best Practice)
PDF
Sorting arrays in PHP
PDF
Dependency Injection with PHP 5.3
PPT
Intro to php
PDF
Php tips-and-tricks4128
PPTX
A Functional Guide to Cat Herding with PHP Generators
PPTX
A Functional Guide to Cat Herding with PHP Generators
PDF
The Origin of Lithium
PDF
Current state-of-php
PDF
Data Types In PHP
PDF
Symfony2 - WebExpo 2010
PDF
Perforce Object and Record Model
PPT
Corephpcomponentpresentation 1211425966721657-8
PPT
Class 2 - Introduction to PHP
PPTX
Looping the Loop with SPL Iterators
PDF
Cli the other SAPI confoo11
PPTX
Webrtc mojo
PPTX
Php functions
PDF
News of the Symfony2 World
PDF
Static Optimization of PHP bytecode (PHPSC 2017)
PHP 良好實踐 (Best Practice)
Sorting arrays in PHP
Dependency Injection with PHP 5.3
Intro to php
Php tips-and-tricks4128
A Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP Generators
The Origin of Lithium
Current state-of-php
Data Types In PHP
Symfony2 - WebExpo 2010
Perforce Object and Record Model
Corephpcomponentpresentation 1211425966721657-8
Class 2 - Introduction to PHP
Looping the Loop with SPL Iterators
Cli the other SAPI confoo11
Webrtc mojo
Php functions
News of the Symfony2 World
Static Optimization of PHP bytecode (PHPSC 2017)
Ad

Viewers also liked (6)

PDF
LESS is More
PDF
Drawing the Line with Browser Compatibility
PDF
Doing more with LESS
PDF
Parsimonious Relevance and Concept Models - CLEF 2008 Domain Specific Talk - ...
PDF
Unsung Heroes of PHP
PDF
Intro to Micro-frameworks
LESS is More
Drawing the Line with Browser Compatibility
Doing more with LESS
Parsimonious Relevance and Concept Models - CLEF 2008 Domain Specific Talk - ...
Unsung Heroes of PHP
Intro to Micro-frameworks
Ad

Similar to PHP 5.3 Overview (20)

PDF
08 Advanced PHP #burningkeyboards
KEY
Can't Miss Features of PHP 5.3 and 5.4
PDF
Phpspec tips&amp;tricks
PPTX
Introducing PHP Latest Updates
PDF
Practical PHP 5.3
PDF
Preparing for the next PHP version (5.6)
PDF
php AND MYSQL _ppt.pdf
ODP
What's new, what's hot in PHP 5.3
PDF
Solid principles
PPTX
PHPneweeeeeeeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Advanced symfony Techniques
PDF
Modern php
KEY
PDF
PHP traits, treat or threat?
ODP
Mastering Namespaces in PHP
PDF
Frameworks da nova Era PHP FuelPHP
PPTX
ODP
Aura Project for PHP
PPTX
FFW Gabrovo PMG - PHP OOP Part 3
PPTX
Ch8(oop)
08 Advanced PHP #burningkeyboards
Can't Miss Features of PHP 5.3 and 5.4
Phpspec tips&amp;tricks
Introducing PHP Latest Updates
Practical PHP 5.3
Preparing for the next PHP version (5.6)
php AND MYSQL _ppt.pdf
What's new, what's hot in PHP 5.3
Solid principles
PHPneweeeeeeeeeeeeeeeeeeeeeeeeeeeeee.pptx
Advanced symfony Techniques
Modern php
PHP traits, treat or threat?
Mastering Namespaces in PHP
Frameworks da nova Era PHP FuelPHP
Aura Project for PHP
FFW Gabrovo PMG - PHP OOP Part 3
Ch8(oop)

Recently uploaded (20)

PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Empathic Computing: Creating Shared Understanding
PDF
KodekX | Application Modernization Development
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PDF
Advanced IT Governance
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Transforming Manufacturing operations through Intelligent Integrations
PDF
Modernizing your data center with Dell and AMD
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
MYSQL Presentation for SQL database connectivity
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Empathic Computing: Creating Shared Understanding
KodekX | Application Modernization Development
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
Advanced IT Governance
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
CIFDAQ's Market Insight: SEC Turns Pro Crypto
madgavkar20181017ppt McKinsey Presentation.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
20250228 LYD VKU AI Blended-Learning.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
Understanding_Digital_Forensics_Presentation.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Transforming Manufacturing operations through Intelligent Integrations
Modernizing your data center with Dell and AMD
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
MYSQL Presentation for SQL database connectivity

PHP 5.3 Overview

  • 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 • Currentlymost 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';
  • 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 <?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'); SOURCES: http://www.php.net/manual/en/class.datetime.php
  • 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 AppModels { class Post extends AppModel {} } // 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 MyAppUtil; class String { public function formatPhone($phone) { // Regex phone number return true; } }
  • 33. “USE” A NAMESPACE <?php use MyAppUtilString as String; $str = new String(); if ($str->formatPhone('123-456-7890')) { echo 'ITS TRUE'; }
  • 34. DEFINING MULTIPLE NAMESPACES One Way Preferred Way! <?php <?php use FrameworkController as BaseController use FrameworkController as BaseController use FrameworkModel as BaseModel use FrameworkModel as BaseModel namespace MyAppControllers; namespace MyAppControllers { class UsersController extends BaseController class UsersController extends { BaseController { } } namespace MyAppUserModel; } class User extends BaseModel { namespace MyAppUserModel { class User extends BaseModel } { } }
  • 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 AppModels { class Posts extends AppModel { const TABLE_NAME = 'posts'; } }
  • 38. THANKS FOR LISTENING Contact Information [t]: @jakefolio [e]: [email protected] [w]: http://www.jakefolio.com