SlideShare une entreprise Scribd logo
1  sur  62
Télécharger pour lire hors ligne
New SPL Features in PHP 5.3

       Matthew Turland
            TEK-X
        May 20, 2010
Hi! My name is…

 •   Senior Platform Engineer for Synacor, Inc.
 •   Former author and TE for php|architect
 •   Author of Web Scraping with PHP
 •   Past contributor to Zend Framework
 •   Lead developer of Phergie
 •   ULL alumni with a BS in computer science
And I work for…

 • Provides internet solutions to ISPs, media
   companies, and advertisers
 • International company with offices in Buffalo,
   New York City, Los Angeles, and Amsterdam
 • Clientele includes most of the top 20 cable
   providers in the United States
 • Great company – join us!
What about you?

 •   Used the SPL before?
 •   Using PHP 5.3?
 •   Computer science background?
 •   Knowledge of data structures?
Pre-5.3 SPL Features

 • Classes: ArrayObject, SplFileInfo, SplSubject,
   SplObserver, etc.
 • Iterators: RecursiveIteratorIterator,
   FilterIterator, LimitIterator, etc.
 • Interfaces: ArrayAccess, Countable, Iterator,
   IteratorAggregate, etc.
 • Functions: spl_autoload_register,
   iterator_to_array, spl_object_hash, etc.
Containers

 “A container is a class, a data structure, or
 an abstract data type whose instances are
 collections of other objects. They are used
 to store objects in an organized way
 following specific access rules.”

 Container (data structure) - Wikipedia
Why containers?

 • We already have arrays and strings!
       array()               'string'
Two excellent reasons

 • Versus traditional arrays, there is potential for:
   – Less CPU usage
   – Less memory usage
Arrays are (not always) great

 • Flexible general purpose container
 • Underlying hash table algorithm is not always
   ideal for the task at hand
Warning: Benchmarks Ahead

 • Lies, Outrageous Lies, and Benchmarks
 • PHP 5.3.2 compiled on Ubuntu 9.10
 • Intel Core2Duo 1.83 GHz, 4 GB DDR2 RAM
 • Performance results are shown in executions
   per second rather than time per execution to
   avoid really small numbers
 • Code and results
The List
SplFixedArray - What

 •   Like an array, but with a fixed length
 •   Only allows integers >= 0 for keys
 •   Can be resized, but at a cost
 •   Not compatible with array functions
SplFixedArray - When

 • It’s best to use this when:
   – You know in advance how many elements you
     want to store (e.g. mysql_num_rows)
   – You only need to access elements in sequential
     order
SplFixedArray - Code
    <?php
    $a = array();
    for ($i = 0; $i < $argv[1]; $i++) {
        $a[$i] = $i;
        $i = $a[$i];
    }
    <?php
    $a = new SplFixedArray($argv[1]);
    for ($i = 0; $i < $argv[1]; $i++) {
        $a[$i] = $i;
        $i = $a[$i];
    }
SplFixedArray - EPS
SplFixedArray - Memory
SplDoublyLinkedList - What

 • Mainly intended as a parent class
 • Same unlimited size as arrays without the
   associated hash map algorithm
 • Less performance, but more memory
   efficiency
SplDoublyLinkedList - When

 • It’s best to use this when:
   – You do not know in advance how many elements
     you want to store
   – You only need to access elements in sequential
     order
SplDoublyLinkedList - Code
  <?php
  $a = array();
  for ($i = 0; $i < $argv[1]; $i++) {
      $a[] = $i;
      $i = $a[$i];
  }
  <?php
  $a = new SplDoublyLinkedList($argv[1]);
  for ($i = 0; $i < $argv[1]; $i++) {
      $a[] = $i;
      $i = $a[$i];
  }
SplDoublyLinkedList - EPS
SplDoublyLinkedList - Memory
The Stack
SplStack - What

 • 2 operations
    – Push: [] for both array and SplStack
    – Pop: array_pop() vs SplStack::pop()
 • Last In, First Out (LIFO)
    – The last item pushed onto the top of the stack is
      the first item that will be popped off of the top of
      the stack
SplStack - When

 • It’s best to use this when:
   – You do not know in advance how many elements
     you want to store
   – You only ever need to access the last element you
     stored
SplStack - Code

    <?php
    $a = array();
    for($i = 0; $i < $argv[1]; $i++) {
        $a[] = $i;
    }
    for($i = 0; $i < $argv[1]; $i++) {
        array_pop($a);
    }
SplStack - Code (cont.)

    <?php
    $a = new SplStack;
    for($i = 0; $i < $argv[1]; $i++) {
        $a[] = $i;
    }
    for($i = 0; $i < $argv[1]; $i++) {
        $a->pop();
    }
SplStack - EPS
SplStack - Memory
The Queue
SplQueue - What

 • 2 operations
    – Enqueue: [] for both array and SplQueue
    – Dequeue: array_shift() vs SplQueue::dequeue()
 • First In, First Out (FIFO)
    – The first item added to the end of the queue will
      be the first item removed from the front of the
      queue
SplQueue - When

• It’s best to use this when:
  – You do not know in advance how many elements
    you want to store
  – You only ever need to access the remaining
    element that was stored earliest
SplQueue - Code

    <?php
    $a = array();
    for($i = 0; $i < $argv[1]; $i++) {
        $a[] = $i;
    }
    for($i = 0; $i < $argv[1]; $i++) {
        array_shift($a);
    }
SplQueue - Code (cont.)

    <?php
    $a = new SplQueue;
    for($i = 0; $i < $argv[1]; $i++) {
        $a[] = $i;
    }
    for($i = 0; $i < $argv[1]; $i++) {
        $a->dequeue();
    }
SplQueue - EPS
SplQueue - Memory
The Heap
SplHeap - What
 • 2 operations
   – Insert: [] + sort vs SplHeap::insert()
   – Remove: array_shift() vs SplHeap::extract()
 • Internally reorders items based on comparison
   – SplHeap::compare() can be overridden
 • Subclasses
   – SplMinHeap
   – SplMaxHeap
 • Better worst-case scenario performance
   versus arrays (heap sort versus quick sort)
SplHeap - When

 • It’s best to use this when:
   – You do not know in advance how many elements
     you want to store
   – You need to access elements in an order based on
     how they compare to each other
SplMinHeap - Code

   <?php
   $a = array();
   for($i = 0; $i < $argv[1]; $i++) {
       $a[] = rand(1, $argv[1]);
       sort($a);
   }
   for($i = 0; $i < $argv[1]; $i++) {
       array_shift($a);
   }
SplMinHeap - Code (cont.)

    <?php
    $a = new SplMinHeap;
    for($i = 0; $i < $argv[1]; $i++) {
        $a->insert(rand(1, $argv[1]));
    }
    for($i = 0; $i < $argv[1]; $i++) {
        $a->extract();
    }
SplMinHeap - EPS
SplMinHeap - Memory
The Priority Queue
SplPriorityQueue - What

 • Accepts a priority with the element value
 • Element with highest priority comes out first
 • Priorities may be of any comparable type
 • SplPriorityQueue::compare() can be
   overridden
 • Operates similarly to a heap
     – In fact, it uses a heap internally for storage
SplPriorityQueue - When

 • It’s best to use this when:
   – You do not know in advance how many elements
     you want to store
   – You need to access elements in an order based on
     how priority values associated with those
     elements compare to each other
SplPriorityQueue - Code
     <?php
     $threshold = $argv[1] * 0.1;
     $a = array();
     $i = 0;
     do {
         if ($i <= $argv[1]) {
             $a[] = array($i, rand(1, 10));
             usort($a, 'priority_sort');
         }
         if ($i > $threshold) {
             array_shift($a);
         }
         $i++;
     } while (count($a));
     function priority_sort($a, $b) {
         return $a[1] - $b[1];
     }
SplPriorityQueue - Code (cont.)
   <?php
   $threshold = $argv[1] * 0.1;
   $a = new SplPriorityQueue;
   $i = 0;
   do {
        if ($i < 1) {
            $a->insert($i, rand(1,10));
        }
        if ($i > $threshold) {
            $a->extract();
        }
        $i++;
   } while (count($a));
SplPriorityQueue - EPS
SplPriorityQueue - Memory
The Set
The Composite Hash Map

    Just pretend the red pills are objects.
SplObjectStorage - What
 • Combination of two data structures
   – Composite hash map: a hash map with objects for
     keys; the spl_object_hash() function must be used
     for arrays to have this capability
   – Set: focuses on a group of values rather than
     individual values with operations like union,
     intersection, difference, and element_of; no
     concept of sequential order
 • Currently lacks a method for the intersection
   operation
SplObjectStorage - When

 • It’s best to use this when:
   – You need to store data using composite (i.e. non-
     scalar) keys
   – You need the ability to access data using set
     operations more so than accessing it in a
     particular order
SplObjectStorage - Code
 <?php
 $a = array();
 for ($i = 0; $i < $argv[1]; $i++) {
     $object = new stdClass;
     $a[spl_object_hash($object)] = $object;
 }
 $a = array();
 $b = array();
 for ($i = 0; $i < $argv[1]; $i++) {
     $a[] = rand(1, $argv[1]);
     $b[] = rand(1, $argv[1]);
 }
 $c = array_merge($a, $b);
 $c = array_diff($a, $b);
SplObjectStorage - Code (cont.)
 <?php
 $a = new SplObjectStorage;
 for ($i = 0; $i < $argv[1]; $i++) {
     $object = new stdClass;
     $a->attach($object, $object);
 }
 $a = new SplObjectStorage;
 $b = new SplObjectStorage;
 for ($i = 0; $i < $argv[1]; $i++) {
     $a->attach((object) rand(1, $argv[1]));
     $b->attach((object) rand(1, $argv[1]));
 }
 $c = clone $a;
 $c->addAll($b);
 $c = clone $a;
 $c->removeAll($b);
SplObjectStorage - EPS
SplObjectStorage - Memory
Thank this guy

 • Etienne Kneuss did a lot of the work on the
   new SPL features in PHP 5.3
Some great SPL resources

 • SPL in the PHP manual
 • Etienne Kneuss' blog
 • "SPL to the Rescue" by Elizabeth Smith
 • “SPL, a bridge not too far” by Michelangelo
   van Dam
 • This presentation as a blog post
Possible future SPL features

 • Graphs
   – Contain nodes and edges connecting them
   – Directional / non-directional
   – Cyclic / acyclic
   – Connected / unconnected
   – Edge costs
 • Trees
   – Acyclic unidirectional graph
   – Hierarchical in nature
Feedback, please!

     http://joind.in/1577
That’s all, folks

 •   Any questions?
 •   http://synacor.com
 •   http://matthewturland.com
 •   me@matthewturland.com
 •   @elazar on Twitter
 •   Elazar on the Freenode IRC network

Contenu connexe

Tendances

Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門Hiromi Ishii
 
Solr & Lucene @ Etsy by Gregg Donovan
Solr & Lucene @ Etsy by Gregg DonovanSolr & Lucene @ Etsy by Gregg Donovan
Solr & Lucene @ Etsy by Gregg DonovanGregg Donovan
 
Metaprogramming in Haskell
Metaprogramming in HaskellMetaprogramming in Haskell
Metaprogramming in HaskellHiromi Ishii
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP GeneratorsMark Baker
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8PrinceGuru MS
 
DBIx::Class beginners
DBIx::Class beginnersDBIx::Class beginners
DBIx::Class beginnersleo lapworth
 
What's new in PHP 8.0?
What's new in PHP 8.0?What's new in PHP 8.0?
What's new in PHP 8.0?Nikita Popov
 
PHP Functions & Arrays
PHP Functions & ArraysPHP Functions & Arrays
PHP Functions & ArraysHenry Osborne
 
Bioinformatics p5-bioperl v2013-wim_vancriekinge
Bioinformatics p5-bioperl v2013-wim_vancriekingeBioinformatics p5-bioperl v2013-wim_vancriekinge
Bioinformatics p5-bioperl v2013-wim_vancriekingeProf. Wim Van Criekinge
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in OptimizationDavid Golden
 
Manifests of Future Past
Manifests of Future PastManifests of Future Past
Manifests of Future PastPuppet
 
PHP Unit 4 arrays
PHP Unit 4 arraysPHP Unit 4 arrays
PHP Unit 4 arraysKumar
 
Perforce Object and Record Model
Perforce Object and Record Model  Perforce Object and Record Model
Perforce Object and Record Model Perforce
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128PrinceGuru MS
 
DBIx::Class introduction - 2010
DBIx::Class introduction - 2010DBIx::Class introduction - 2010
DBIx::Class introduction - 2010leo lapworth
 

Tendances (20)

Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門
 
Solr & Lucene @ Etsy by Gregg Donovan
Solr & Lucene @ Etsy by Gregg DonovanSolr & Lucene @ Etsy by Gregg Donovan
Solr & Lucene @ Etsy by Gregg Donovan
 
Metaprogramming in Haskell
Metaprogramming in HaskellMetaprogramming in Haskell
Metaprogramming in Haskell
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP Generators
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
 
DBIx::Class beginners
DBIx::Class beginnersDBIx::Class beginners
DBIx::Class beginners
 
What's new in PHP 8.0?
What's new in PHP 8.0?What's new in PHP 8.0?
What's new in PHP 8.0?
 
PHP Functions & Arrays
PHP Functions & ArraysPHP Functions & Arrays
PHP Functions & Arrays
 
Bioinformatics p5-bioperl v2013-wim_vancriekinge
Bioinformatics p5-bioperl v2013-wim_vancriekingeBioinformatics p5-bioperl v2013-wim_vancriekinge
Bioinformatics p5-bioperl v2013-wim_vancriekinge
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in Optimization
 
Manifests of Future Past
Manifests of Future PastManifests of Future Past
Manifests of Future Past
 
Solr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene EuroconSolr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene Eurocon
 
PHP Unit 4 arrays
PHP Unit 4 arraysPHP Unit 4 arrays
PHP Unit 4 arrays
 
Lithium Best
Lithium Best Lithium Best
Lithium Best
 
Perforce Object and Record Model
Perforce Object and Record Model  Perforce Object and Record Model
Perforce Object and Record Model
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Neatly folding-a-tree
Neatly folding-a-treeNeatly folding-a-tree
Neatly folding-a-tree
 
DBIx::Class introduction - 2010
DBIx::Class introduction - 2010DBIx::Class introduction - 2010
DBIx::Class introduction - 2010
 
Groovy unleashed
Groovy unleashed Groovy unleashed
Groovy unleashed
 

Similaire à New SPL Features in PHP 5.3

Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...
Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...
Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...Dhivyaa C.R
 
PHP and MySQL Tips and tricks, DC 2007
PHP and MySQL Tips and tricks, DC 2007PHP and MySQL Tips and tricks, DC 2007
PHP and MySQL Tips and tricks, DC 2007Damien Seguy
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsPierre MARTIN
 
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks Damien Seguy
 
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011camp_drupal_ua
 
PHP security audits
PHP security auditsPHP security audits
PHP security auditsDamien Seguy
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code ReviewDamien Seguy
 
9780538745840 ppt ch06
9780538745840 ppt ch069780538745840 ppt ch06
9780538745840 ppt ch06Terry Yoast
 
Laravel collections an overview - Laravel SP
Laravel collections an overview - Laravel SPLaravel collections an overview - Laravel SP
Laravel collections an overview - Laravel SPMatheus Marabesi
 
Scaling php applications with redis
Scaling php applications with redisScaling php applications with redis
Scaling php applications with redisjimbojsb
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Damien Seguy
 

Similaire à New SPL Features in PHP 5.3 (20)

Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...
Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...
Regular expressions, Session and Cookies by Dr.C.R.Dhivyaa Kongu Engineering ...
 
UNIT IV (4).pptx
UNIT IV (4).pptxUNIT IV (4).pptx
UNIT IV (4).pptx
 
PHP and MySQL Tips and tricks, DC 2007
PHP and MySQL Tips and tricks, DC 2007PHP and MySQL Tips and tricks, DC 2007
PHP and MySQL Tips and tricks, DC 2007
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks
 
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
 
Arrays in C++
Arrays in C++Arrays in C++
Arrays in C++
 
Php Intermediate
Php IntermediatePhp Intermediate
Php Intermediate
 
Php array
Php arrayPhp array
Php array
 
PHP security audits
PHP security auditsPHP security audits
PHP security audits
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
 
Smarty
SmartySmarty
Smarty
 
PHP-04-Arrays.ppt
PHP-04-Arrays.pptPHP-04-Arrays.ppt
PHP-04-Arrays.ppt
 
Chapter 2 wbp.pptx
Chapter 2 wbp.pptxChapter 2 wbp.pptx
Chapter 2 wbp.pptx
 
9780538745840 ppt ch06
9780538745840 ppt ch069780538745840 ppt ch06
9780538745840 ppt ch06
 
SPL, not a bridge too far
SPL, not a bridge too farSPL, not a bridge too far
SPL, not a bridge too far
 
Laravel collections an overview - Laravel SP
Laravel collections an overview - Laravel SPLaravel collections an overview - Laravel SP
Laravel collections an overview - Laravel SP
 
Scaling php applications with redis
Scaling php applications with redisScaling php applications with redis
Scaling php applications with redis
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
 
[Start] Scala
[Start] Scala[Start] Scala
[Start] Scala
 

Plus de Matthew Turland

New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)Matthew Turland
 
Open Source Networking with Vyatta
Open Source Networking with VyattaOpen Source Networking with Vyatta
Open Source Networking with VyattaMatthew Turland
 
When RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTPWhen RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTPMatthew Turland
 
Open Source Content Management Systems
Open Source Content Management SystemsOpen Source Content Management Systems
Open Source Content Management SystemsMatthew Turland
 
PHP Basics for Designers
PHP Basics for DesignersPHP Basics for Designers
PHP Basics for DesignersMatthew Turland
 
Creating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew TurlandCreating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew TurlandMatthew Turland
 
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake Deville
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake DevilleThe OpenSolaris Operating System and Sun xVM VirtualBox - Blake Deville
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake DevilleMatthew Turland
 
Utilizing the Xen Hypervisor in business practice - Bryan Fusilier
Utilizing the Xen Hypervisor in business practice - Bryan FusilierUtilizing the Xen Hypervisor in business practice - Bryan Fusilier
Utilizing the Xen Hypervisor in business practice - Bryan FusilierMatthew Turland
 
The Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan FarnellThe Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan FarnellMatthew Turland
 
PDQ Programming Languages plus an overview of Alice - Frank Ducrest
PDQ Programming Languages plus an overview of Alice - Frank DucrestPDQ Programming Languages plus an overview of Alice - Frank Ducrest
PDQ Programming Languages plus an overview of Alice - Frank DucrestMatthew Turland
 
Getting Involved in Open Source - Matthew Turland
Getting Involved in Open Source - Matthew TurlandGetting Involved in Open Source - Matthew Turland
Getting Involved in Open Source - Matthew TurlandMatthew Turland
 

Plus de Matthew Turland (15)

New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)
 
Sinatra
SinatraSinatra
Sinatra
 
Web Scraping with PHP
Web Scraping with PHPWeb Scraping with PHP
Web Scraping with PHP
 
Web Scraping with PHP
Web Scraping with PHPWeb Scraping with PHP
Web Scraping with PHP
 
Open Source Networking with Vyatta
Open Source Networking with VyattaOpen Source Networking with Vyatta
Open Source Networking with Vyatta
 
When RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTPWhen RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTP
 
Open Source Content Management Systems
Open Source Content Management SystemsOpen Source Content Management Systems
Open Source Content Management Systems
 
PHP Basics for Designers
PHP Basics for DesignersPHP Basics for Designers
PHP Basics for Designers
 
Web Scraping with PHP
Web Scraping with PHPWeb Scraping with PHP
Web Scraping with PHP
 
Creating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew TurlandCreating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew Turland
 
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake Deville
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake DevilleThe OpenSolaris Operating System and Sun xVM VirtualBox - Blake Deville
The OpenSolaris Operating System and Sun xVM VirtualBox - Blake Deville
 
Utilizing the Xen Hypervisor in business practice - Bryan Fusilier
Utilizing the Xen Hypervisor in business practice - Bryan FusilierUtilizing the Xen Hypervisor in business practice - Bryan Fusilier
Utilizing the Xen Hypervisor in business practice - Bryan Fusilier
 
The Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan FarnellThe Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan Farnell
 
PDQ Programming Languages plus an overview of Alice - Frank Ducrest
PDQ Programming Languages plus an overview of Alice - Frank DucrestPDQ Programming Languages plus an overview of Alice - Frank Ducrest
PDQ Programming Languages plus an overview of Alice - Frank Ducrest
 
Getting Involved in Open Source - Matthew Turland
Getting Involved in Open Source - Matthew TurlandGetting Involved in Open Source - Matthew Turland
Getting Involved in Open Source - Matthew Turland
 

Dernier

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusZilliz
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 

Dernier (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

New SPL Features in PHP 5.3

  • 1. New SPL Features in PHP 5.3 Matthew Turland TEK-X May 20, 2010
  • 2. Hi! My name is… • Senior Platform Engineer for Synacor, Inc. • Former author and TE for php|architect • Author of Web Scraping with PHP • Past contributor to Zend Framework • Lead developer of Phergie • ULL alumni with a BS in computer science
  • 3. And I work for… • Provides internet solutions to ISPs, media companies, and advertisers • International company with offices in Buffalo, New York City, Los Angeles, and Amsterdam • Clientele includes most of the top 20 cable providers in the United States • Great company – join us!
  • 4. What about you? • Used the SPL before? • Using PHP 5.3? • Computer science background? • Knowledge of data structures?
  • 5. Pre-5.3 SPL Features • Classes: ArrayObject, SplFileInfo, SplSubject, SplObserver, etc. • Iterators: RecursiveIteratorIterator, FilterIterator, LimitIterator, etc. • Interfaces: ArrayAccess, Countable, Iterator, IteratorAggregate, etc. • Functions: spl_autoload_register, iterator_to_array, spl_object_hash, etc.
  • 6. Containers “A container is a class, a data structure, or an abstract data type whose instances are collections of other objects. They are used to store objects in an organized way following specific access rules.” Container (data structure) - Wikipedia
  • 7. Why containers? • We already have arrays and strings! array() 'string'
  • 8. Two excellent reasons • Versus traditional arrays, there is potential for: – Less CPU usage – Less memory usage
  • 9. Arrays are (not always) great • Flexible general purpose container • Underlying hash table algorithm is not always ideal for the task at hand
  • 10. Warning: Benchmarks Ahead • Lies, Outrageous Lies, and Benchmarks • PHP 5.3.2 compiled on Ubuntu 9.10 • Intel Core2Duo 1.83 GHz, 4 GB DDR2 RAM • Performance results are shown in executions per second rather than time per execution to avoid really small numbers • Code and results
  • 12. SplFixedArray - What • Like an array, but with a fixed length • Only allows integers >= 0 for keys • Can be resized, but at a cost • Not compatible with array functions
  • 13. SplFixedArray - When • It’s best to use this when: – You know in advance how many elements you want to store (e.g. mysql_num_rows) – You only need to access elements in sequential order
  • 14. SplFixedArray - Code <?php $a = array(); for ($i = 0; $i < $argv[1]; $i++) { $a[$i] = $i; $i = $a[$i]; } <?php $a = new SplFixedArray($argv[1]); for ($i = 0; $i < $argv[1]; $i++) { $a[$i] = $i; $i = $a[$i]; }
  • 17. SplDoublyLinkedList - What • Mainly intended as a parent class • Same unlimited size as arrays without the associated hash map algorithm • Less performance, but more memory efficiency
  • 18. SplDoublyLinkedList - When • It’s best to use this when: – You do not know in advance how many elements you want to store – You only need to access elements in sequential order
  • 19. SplDoublyLinkedList - Code <?php $a = array(); for ($i = 0; $i < $argv[1]; $i++) { $a[] = $i; $i = $a[$i]; } <?php $a = new SplDoublyLinkedList($argv[1]); for ($i = 0; $i < $argv[1]; $i++) { $a[] = $i; $i = $a[$i]; }
  • 23. SplStack - What • 2 operations – Push: [] for both array and SplStack – Pop: array_pop() vs SplStack::pop() • Last In, First Out (LIFO) – The last item pushed onto the top of the stack is the first item that will be popped off of the top of the stack
  • 24. SplStack - When • It’s best to use this when: – You do not know in advance how many elements you want to store – You only ever need to access the last element you stored
  • 25. SplStack - Code <?php $a = array(); for($i = 0; $i < $argv[1]; $i++) { $a[] = $i; } for($i = 0; $i < $argv[1]; $i++) { array_pop($a); }
  • 26. SplStack - Code (cont.) <?php $a = new SplStack; for($i = 0; $i < $argv[1]; $i++) { $a[] = $i; } for($i = 0; $i < $argv[1]; $i++) { $a->pop(); }
  • 30. SplQueue - What • 2 operations – Enqueue: [] for both array and SplQueue – Dequeue: array_shift() vs SplQueue::dequeue() • First In, First Out (FIFO) – The first item added to the end of the queue will be the first item removed from the front of the queue
  • 31. SplQueue - When • It’s best to use this when: – You do not know in advance how many elements you want to store – You only ever need to access the remaining element that was stored earliest
  • 32. SplQueue - Code <?php $a = array(); for($i = 0; $i < $argv[1]; $i++) { $a[] = $i; } for($i = 0; $i < $argv[1]; $i++) { array_shift($a); }
  • 33. SplQueue - Code (cont.) <?php $a = new SplQueue; for($i = 0; $i < $argv[1]; $i++) { $a[] = $i; } for($i = 0; $i < $argv[1]; $i++) { $a->dequeue(); }
  • 37. SplHeap - What • 2 operations – Insert: [] + sort vs SplHeap::insert() – Remove: array_shift() vs SplHeap::extract() • Internally reorders items based on comparison – SplHeap::compare() can be overridden • Subclasses – SplMinHeap – SplMaxHeap • Better worst-case scenario performance versus arrays (heap sort versus quick sort)
  • 38. SplHeap - When • It’s best to use this when: – You do not know in advance how many elements you want to store – You need to access elements in an order based on how they compare to each other
  • 39. SplMinHeap - Code <?php $a = array(); for($i = 0; $i < $argv[1]; $i++) { $a[] = rand(1, $argv[1]); sort($a); } for($i = 0; $i < $argv[1]; $i++) { array_shift($a); }
  • 40. SplMinHeap - Code (cont.) <?php $a = new SplMinHeap; for($i = 0; $i < $argv[1]; $i++) { $a->insert(rand(1, $argv[1])); } for($i = 0; $i < $argv[1]; $i++) { $a->extract(); }
  • 44. SplPriorityQueue - What • Accepts a priority with the element value • Element with highest priority comes out first • Priorities may be of any comparable type • SplPriorityQueue::compare() can be overridden • Operates similarly to a heap – In fact, it uses a heap internally for storage
  • 45. SplPriorityQueue - When • It’s best to use this when: – You do not know in advance how many elements you want to store – You need to access elements in an order based on how priority values associated with those elements compare to each other
  • 46. SplPriorityQueue - Code <?php $threshold = $argv[1] * 0.1; $a = array(); $i = 0; do { if ($i <= $argv[1]) { $a[] = array($i, rand(1, 10)); usort($a, 'priority_sort'); } if ($i > $threshold) { array_shift($a); } $i++; } while (count($a)); function priority_sort($a, $b) { return $a[1] - $b[1]; }
  • 47. SplPriorityQueue - Code (cont.) <?php $threshold = $argv[1] * 0.1; $a = new SplPriorityQueue; $i = 0; do { if ($i < 1) { $a->insert($i, rand(1,10)); } if ($i > $threshold) { $a->extract(); } $i++; } while (count($a));
  • 51. The Composite Hash Map Just pretend the red pills are objects.
  • 52. SplObjectStorage - What • Combination of two data structures – Composite hash map: a hash map with objects for keys; the spl_object_hash() function must be used for arrays to have this capability – Set: focuses on a group of values rather than individual values with operations like union, intersection, difference, and element_of; no concept of sequential order • Currently lacks a method for the intersection operation
  • 53. SplObjectStorage - When • It’s best to use this when: – You need to store data using composite (i.e. non- scalar) keys – You need the ability to access data using set operations more so than accessing it in a particular order
  • 54. SplObjectStorage - Code <?php $a = array(); for ($i = 0; $i < $argv[1]; $i++) { $object = new stdClass; $a[spl_object_hash($object)] = $object; } $a = array(); $b = array(); for ($i = 0; $i < $argv[1]; $i++) { $a[] = rand(1, $argv[1]); $b[] = rand(1, $argv[1]); } $c = array_merge($a, $b); $c = array_diff($a, $b);
  • 55. SplObjectStorage - Code (cont.) <?php $a = new SplObjectStorage; for ($i = 0; $i < $argv[1]; $i++) { $object = new stdClass; $a->attach($object, $object); } $a = new SplObjectStorage; $b = new SplObjectStorage; for ($i = 0; $i < $argv[1]; $i++) { $a->attach((object) rand(1, $argv[1])); $b->attach((object) rand(1, $argv[1])); } $c = clone $a; $c->addAll($b); $c = clone $a; $c->removeAll($b);
  • 58. Thank this guy • Etienne Kneuss did a lot of the work on the new SPL features in PHP 5.3
  • 59. Some great SPL resources • SPL in the PHP manual • Etienne Kneuss' blog • "SPL to the Rescue" by Elizabeth Smith • “SPL, a bridge not too far” by Michelangelo van Dam • This presentation as a blog post
  • 60. Possible future SPL features • Graphs – Contain nodes and edges connecting them – Directional / non-directional – Cyclic / acyclic – Connected / unconnected – Edge costs • Trees – Acyclic unidirectional graph – Hierarchical in nature
  • 61. Feedback, please! http://joind.in/1577
  • 62. That’s all, folks • Any questions? • http://synacor.com • http://matthewturland.com • me@matthewturland.com • @elazar on Twitter • Elazar on the Freenode IRC network