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

Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
PrinceGuru MS
 
PHP Unit 4 arrays
PHP Unit 4 arraysPHP Unit 4 arrays
PHP Unit 4 arrays
Kumar
 
Php tips-and-tricks4128
Php tips-and-tricks4128Php tips-and-tricks4128
Php tips-and-tricks4128
PrinceGuru MS
 

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

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
camp_drupal_ua
 
9780538745840 ppt ch06
9780538745840 ppt ch069780538745840 ppt ch06
9780538745840 ppt ch06
Terry Yoast
 
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

Open Source Networking with Vyatta
Open Source Networking with VyattaOpen Source Networking with Vyatta
Open Source Networking with Vyatta
Matthew Turland
 
Open Source Content Management Systems
Open Source Content Management SystemsOpen Source Content Management Systems
Open Source Content Management Systems
Matthew Turland
 
PHP Basics for Designers
PHP Basics for DesignersPHP Basics for Designers
PHP Basics for Designers
Matthew 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 Turland
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
Matthew 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 Fusilier
Matthew Turland
 
The Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan FarnellThe Ruby Programming Language - Ryan Farnell
The Ruby Programming Language - Ryan Farnell
Matthew 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

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
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...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
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
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
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...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

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