SlideShare a Scribd company logo
1 of 42
SPL, not a bridge too far
Dutch PHP Conference 2009 - Amsterdam
Who am I ?

Michelangelo van Dam
Independent Enterprise PHP consultant


@dragonbe

http://dragonbe.com




              2
Who are you ?


   You know OOP ?
  You know php.net ?
   You know arrays ?




         3
What is SPL ?

               Standard PHP Library
           interfaces, classes and methods
       solve common development problems

As of 5.3 SPL cannot be turned off from the source !



                         4
Why use SPL ?


SPL provides a huge toolkit that assists you to easily
iterate over a diversity of data structures in a
standardized way




                          5
What does it provide ?
•   ArrayObject - approach arrays as objects
•   Iterators - various iterators
•   Interfaces - Countable Interface
•   Exceptions - exceptions to streamline errorhandling
•   SPL Functions - extra functions and autoloader func
•   SplFileInfo - tools for filesystem access
•   Datastructures - structuring data sequences


                            6
ArrayObject


•   provides an interface
    - treat arrays as objects
    - elements are iteratable



                                7
ArrayObject methods
•   ArrayObject::append
•   ArrayObject::__construct
•   ArrayObject::count
•   ArrayObject::getIterator
•   ArrayObject::offsetExists
•   ArrayObject::offsetGet
•   ArrayObject::offsetSet
•   ArrayObject::offsetUnset

                            8
<?php
      ArrayObject w/o SPL
// file: nospl_arrayobject01.php

$myArray =   array (
  quot;monkeyquot;   => quot;bananasquot;,
  quot;rabbitquot;   => quot;carrotsquot;,
  quot;ogrequot;     => quot;onionsquot;,
);


echo quot;Ogres exists ? quot;
  . (key_exists('ogre', $myArray) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;;

echo quot;Ogres equals quot;
  . $myArray['ogre'] . quot;nquot;;




                               9
<?php
      ArrayObject Example
// file: spl_arrayobject01.php

$myArray =   array (
  quot;monkeyquot;   => quot;bananasquot;,
  quot;rabbitquot;   => quot;carrotsquot;,
  quot;ogrequot;     => quot;onionsquot;,
);

// create an object of the array
$arrayObj = new ArrayObject($myArray);

echo quot;Ogres exists ? quot;
  . ($arrayObj->offsetExists(quot;ogrequot;) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;;

echo quot;Ogres equals quot;
  . $arrayObj->offsetGet(quot;ogrequot;) . quot;nquot;;




                                 10
ArrayObject Output
$ /usr/bin/php ./nospl_arrayobject01.php
Ogres exists ? Yes
Ogres equals onions
Execution time: 0.00064299999999995 microseconds.

$ /usr/bin/php ./spl_arrayobject01.php
Ogres exists ? Yes
Ogres equals onions
Execution time: 0.00054399999999999 microseconds.




                               11
Iterator


•   move back and forth in a stack
•   distinct methods to access keys and values




                            12
Iterators
•   ArrayIterator
•   CachingIterator
•   RecursiveCachingIterator
•   DirectoryIterator
•   RecursiveDirectoryIterator
•   FilterIterator
•   LimitIterator
•   ParentIterator
•   RecursiveIteratorIterator

                           13
The ArrayIterator


iteration methods on array objects




                14
ArrayIterator Example Case
•   Array with 3 elements
    - monkey => bananas,
    - rabbit => carrots,
    - ogre => onions
•   display total elements
•   display key/value pairs while looping
•   display key/value pair for 2nd element


                             15
<?php
     ArrayIterator w/o SPL
// file: nospl_iterator01.php
$myArray = array (
    quot;monkeyquot; => quot;bananasquot;,
    quot;rabbitquot; => quot;carrotsquot;,
    quot;ogrequot;   => quot;onionsquot;,
);
echo quot;$myArray has {sizeof($myArray)} elementsnquot;;
foreach ($myArray as $key => $value) {
  echo quot;{$key}: {$value}nquot;;
}
reset($myArray);
next($myArray);
echo quot;elem 2:quot; . key($myArray) . quot;: quot; . current($myArray) . quot;nquot;;




                               16
<?php
       ArrayIterator w/ SPL
// file: spl_iterator01.php
$myArray = array (
  “monkey” => “bananas”,
  “rabbit” => “carrots”,
  “ogre” => “onions”,
);
$arrayObj = new ArrayObject($myArray);
$iterator = $arrayObj->getIterator();
echo quot;$myArray has {$arrayObj->count()} elementsnquot;;
while ($iterator->valid()) {
    echo quot;{$iterator->key()}: {$iterator->current()}nquot;;
    $iterator->next();
}
$iterator->seek(1);
echo quot;elem 2:{$iterator->key()}: {$iterator->current()}nquot;;




                               17
ArrayIterator Output
$ /usr/bin/php ./nospl_iterator01.php
$myArray has 3 elements
monkey: bananas
rabbit: carrots
ogre: onions
elem 2:rabbit: carrots
Execution time: 0.0020509999999999 microseconds.


$ /usr/bin/php ./spl_iterator01.php
$myArray has 3 elements
monkey: bananas
rabbit: carrots
ogre: onions
elem 2:rabbit: carrots
Execution time: 0.001346 microseconds.




                               18
Interfaces

•   Countable
    - provides an internal counter
•   SeekableIterator
    - provides an internal stack seeker


                             19
<?php
           Countable Example
//file: spl_countable01.php
class TequillaCounter implements Countable
{
    public function count()
    {
        static $count = 0;
        return ++$count;
    }

    public function order()
    {
        $order = $this->count();
        echo ($order > 3 ? quot;Floor!quot; : quot;{$order} tequillaquot;) . PHP_EOL;
    }
}




                                 20
Countable continued...
$shots = new TequillaCounter();
$shots->order();
$shots->order();
$shots->order();
$shots->order();

Output:
$ /usr/bin/php ./countable01.php
1 tequilla
2 tequilla
3 tequilla
Floor!




                                  21
SPL Exceptions
•   SPL Exceptions
    - templates
    - throw exceptions
    - common issues
•   Types of exceptions
    - LogicExceptions
    - RuntimeExceptions


                          22
SPL LogicException Tree




           23
SPL RuntimeException Tree




            24
<?php
           Exceptions Example
//file: spl_exception01.php
class MyClass
{
    public function giveANumberFromOneToTen($number)
    {
        if($number < 1 || $number > 10) {
            throw new OutOfBoundsException('Number should be between 1 and 10');
        }
        echo $number . PHP_EOL;
    }
}

$my = new MyClass();
try {
    $my->giveANumberFromOneToTen(5);
    $my->giveANumberFromOneToTen(20);
} catch (OutOfBoundsException $e) {
    echo $e->getMessage() . PHP_EOL;
}

Output:
$ /usr/bin/php ./spl_exception01.php
5
Number should be between 1 and 10




                                         25
SPL Functions
•   class_implements
    Return the interfaces which are implemented by the given class
•   class_parents
    Return the parent classes of the given class
•   iterator_apply
    Apply a user function to every element of an iterator
•   iterator_count
    Count the elements in an iterator
•   iterator_to_array
    Copy the iterator into an array
•   spl_autoload_call
    Try all registered __autoload() function to load requested class

                                 26
SPL Functions (2)
•   spl_autoload_functions
    Return all registered __autoload() functions
•   spl_autoload_register
    Register given function as __autoload() implementation
•   spl_autoload_unregister
    Unregister given function as __autoload() implementation
•   spl_autoload
    Default implementation for __autoload()
•   spl_classes
    Return available SPL classes
•   spl_object_hash
    Return hash id for given object

                                27
<?php
        SplFunctions Example
interface foo {}
interface bar {}

class baz implements foo, bar {}
class example extends baz {}

var_dump(class_implements(new baz));

var_dump(class_implements(new example));




                               28
Output of SplFunctions
array(2) {
  [quot;fooquot;]=>
  string(3)   quot;fooquot;
  [quot;barquot;]=>
  string(3)   quot;barquot;
}
array(2) {
  [quot;barquot;]=>
  string(3)   quot;barquot;
  [quot;fooquot;]=>
  string(3)   quot;fooquot;
}




                      29
SplFileInfo
•   SplFileInfo::__construct        •   SplFileInfo::getLinkTarget
•   SplFileInfo::getATime           •   SplFileInfo::getMTime
•   SplFileInfo::getBasename        •   SplFileInfo::getOwner
•   SplFileInfo::getCTime           •   SplFileInfo::getPath
•   SplFileInfo::getFileInfo        •   SplFileInfo::getPathInfo
•   SplFileInfo::getFilename        •   SplFileInfo::getPathname
•   SplFileInfo::getGroup           •   SplFileInfo::getPerms
•   SplFileInfo::getInode




                               30
SplFileInfo (2)
•   SplFileInfo::getRealPath         •   SplFileInfo::isReadable
•   SplFileInfo::getSize             •   SplFileInfo::isWritable
•   SplFileInfo::getType             •   SplFileInfo::openFile
•   SplFileInfo::isDir               •   SplFileInfo::setFileClass
•   SplFileInfo::isExecutable        •   SplFileInfo::setInfoClass
•   SplFileInfo::isFile              •   SplFileInfo::__toString
•   SplFileInfo::isLink




                                31
<?php
         SplFileInfo Example
// use the current file to get information from
$file = new SplFileInfo(dirname(__FILE__));

var_dump($file->isFile());
var_dump($file->getMTime());
var_dump($file->getSize());
var_dump($file->getFileInfo());
var_dump($file->getOwner());



//output
bool(false)
int(1244760945)
int(408)
object(SplFileInfo)#2 (0) {
}
int(501)


                                  32
Data Structures
•   Available in PHP 5.3.x

    -   SplDoublyLinkedList
        ✓ SplStack
        ✓ SplQueue
        ✓ SplHeap
        ✓ SplMaxHeap
        ✓ SplMinHeap
        ✓ SplPriorityQueue

                              33
Data Structures Example
<?php
// file: spl_stack01.php
$stack = new SplStack();
$stack->push('Message 1');
$stack->push('Message 2');
$stack->push('Message 3');

echo $stack->pop() . PHP_EOL;
echo $stack->pop() . PHP_EOL;
echo $stack->pop() . PHP_EOL;

Outputs:
$ /usr/bin/php ./spl_stack01.php
Message 3
Message 2
Message 1




                                34
Not a bridge too far...




           35
Conclusion


SPL can help you solve common PHP issues
        it’s built-in, so why not use it
   it requires no “advanced skills” to use




                    36
Only one minor thing...




           37
Documentation problem

•   php.net/spl needs more documentation !
•   you can help on that part:
    - see http://elizabethmariesmith.com/2009/02/setting-up-phd-on-windows
    - you can set up phpdoc on each platform !
    - Efnet: #php.doc channel
    - http://doc.php.net - phpdoc@php.net

                                    38
More about SPL...
•   main SPL documentation:
    http://php.net/spl
•   PHPro Tutorials on SPL:
    http://www.phpro.org/tutorials/Introduction-to-SPL.html
•   Lorenzo Alberton’s blog:
    http://www.alberton.info/php_5.3_spl_data_structures.html
•   http://www.colder.ch/news/01-08-2009/34/splobjectstorage-for-
    a-fa.html



                                39
License
This presentation is released under the Creative Commons
Attribution-Share Alike 3.0 Unported License
You are free:
- to share : to copy, distribute and transmit the work
- to remix : to adapt the work

Under the following conditions:
- attribution :You must attribute the work in the manner specified by the author or licensor
- share alike : If you alter, transform, or build upon this work, you may distribute the resulting work
only under the same, similar or a compatible license



See: http://creativecommons.org/licenses/by-sa/3.0/



                                                40
Credits


Golden Gate Bridge - Felix De Vliegher
http://www.flickr.com/photos/felixdv/2883471022/




                      41
Thank you

        Find my slides on
http://slideshare.net/DragonBe

    Don’t forget to vote !
     http://joind.in/586




            42

More Related Content

What's hot

SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
jsmith92
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
Lin Yo-An
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
Lin Yo-An
 

What's hot (20)

Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation Tutorial
 
CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
Cli the other sapi pbc11
Cli the other sapi pbc11Cli the other sapi pbc11
Cli the other sapi pbc11
 
What's New in Perl? v5.10 - v5.16
What's New in Perl?  v5.10 - v5.16What's New in Perl?  v5.10 - v5.16
What's New in Perl? v5.10 - v5.16
 
SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
 
Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?
 
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur..."How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Call Return Exploration
Call Return ExplorationCall Return Exploration
Call Return Exploration
 
New in php 7
New in php 7New in php 7
New in php 7
 
Cli the other SAPI confoo11
Cli the other SAPI confoo11Cli the other SAPI confoo11
Cli the other SAPI confoo11
 
Calling Functions
Calling FunctionsCalling Functions
Calling Functions
 
Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
 
PHP Functions & Arrays
PHP Functions & ArraysPHP Functions & Arrays
PHP Functions & Arrays
 
Let's build a parser!
Let's build a parser!Let's build a parser!
Let's build a parser!
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 

Similar to SPL, not a bridge too far

PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
Kang-min Liu
 
Barely Legal Xxx Perl Presentation
Barely Legal Xxx Perl PresentationBarely Legal Xxx Perl Presentation
Barely Legal Xxx Perl Presentation
Attila Balazs
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
Iftekhar Eather
 

Similar to SPL, not a bridge too far (20)

10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst Tips
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Php 2
Php 2Php 2
Php 2
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
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
 
What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?What's up with Prototype and script.aculo.us?
What's up with Prototype and script.aculo.us?
 
Functional Javascript
Functional JavascriptFunctional Javascript
Functional Javascript
 
Bioinformatica 10-11-2011-p6-bioperl
Bioinformatica 10-11-2011-p6-bioperlBioinformatica 10-11-2011-p6-bioperl
Bioinformatica 10-11-2011-p6-bioperl
 
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
 
Barely Legal Xxx Perl Presentation
Barely Legal Xxx Perl PresentationBarely Legal Xxx Perl Presentation
Barely Legal Xxx Perl Presentation
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
 
Intro to The PHP SPL
Intro to The PHP SPLIntro to The PHP SPL
Intro to The PHP SPL
 
Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09Spl Not A Bridge Too Far phpNW09
Spl Not A Bridge Too Far phpNW09
 
PHP
PHP PHP
PHP
 
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
 
Web Technology_10.ppt
Web Technology_10.pptWeb Technology_10.ppt
Web Technology_10.ppt
 

More from Michelangelo van Dam

Zf2 how arrays will save your project
Zf2   how arrays will save your projectZf2   how arrays will save your project
Zf2 how arrays will save your project
Michelangelo van Dam
 

More from Michelangelo van Dam (20)

GDPR Art. 25 - Privacy by design and default
GDPR Art. 25 - Privacy by design and defaultGDPR Art. 25 - Privacy by design and default
GDPR Art. 25 - Privacy by design and default
 
Moving from app services to azure functions
Moving from app services to azure functionsMoving from app services to azure functions
Moving from app services to azure functions
 
Privacy by design
Privacy by designPrivacy by design
Privacy by design
 
DevOps or DevSecOps
DevOps or DevSecOpsDevOps or DevSecOps
DevOps or DevSecOps
 
Privacy by design
Privacy by designPrivacy by design
Privacy by design
 
Continuous deployment 2.0
Continuous deployment 2.0Continuous deployment 2.0
Continuous deployment 2.0
 
Let your tests drive your code
Let your tests drive your codeLet your tests drive your code
Let your tests drive your code
 
General Data Protection Regulation, a developer's story
General Data Protection Regulation, a developer's storyGeneral Data Protection Regulation, a developer's story
General Data Protection Regulation, a developer's story
 
Leveraging a distributed architecture to your advantage
Leveraging a distributed architecture to your advantageLeveraging a distributed architecture to your advantage
Leveraging a distributed architecture to your advantage
 
The road to php 7.1
The road to php 7.1The road to php 7.1
The road to php 7.1
 
Open source for a successful business
Open source for a successful businessOpen source for a successful business
Open source for a successful business
 
Decouple your framework now, thank me later
Decouple your framework now, thank me laterDecouple your framework now, thank me later
Decouple your framework now, thank me later
 
Deploy to azure in less then 15 minutes
Deploy to azure in less then 15 minutesDeploy to azure in less then 15 minutes
Deploy to azure in less then 15 minutes
 
Azure and OSS, a match made in heaven
Azure and OSS, a match made in heavenAzure and OSS, a match made in heaven
Azure and OSS, a match made in heaven
 
Getting hands dirty with php7
Getting hands dirty with php7Getting hands dirty with php7
Getting hands dirty with php7
 
Zf2 how arrays will save your project
Zf2   how arrays will save your projectZf2   how arrays will save your project
Zf2 how arrays will save your project
 
Create, test, secure, repeat
Create, test, secure, repeatCreate, test, secure, repeat
Create, test, secure, repeat
 
The Continuous PHP Pipeline
The Continuous PHP PipelineThe Continuous PHP Pipeline
The Continuous PHP Pipeline
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the testsPHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
 
Easily extend your existing php app with an api
Easily extend your existing php app with an apiEasily extend your existing php app with an api
Easily extend your existing php app with an api
 

Recently uploaded

Recently uploaded (20)

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
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
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
 
[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
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
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
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.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
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
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...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
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...
 
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
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 

SPL, not a bridge too far

  • 1. SPL, not a bridge too far Dutch PHP Conference 2009 - Amsterdam
  • 2. Who am I ? Michelangelo van Dam Independent Enterprise PHP consultant @dragonbe http://dragonbe.com 2
  • 3. Who are you ? You know OOP ? You know php.net ? You know arrays ? 3
  • 4. What is SPL ? Standard PHP Library interfaces, classes and methods solve common development problems As of 5.3 SPL cannot be turned off from the source ! 4
  • 5. Why use SPL ? SPL provides a huge toolkit that assists you to easily iterate over a diversity of data structures in a standardized way 5
  • 6. What does it provide ? • ArrayObject - approach arrays as objects • Iterators - various iterators • Interfaces - Countable Interface • Exceptions - exceptions to streamline errorhandling • SPL Functions - extra functions and autoloader func • SplFileInfo - tools for filesystem access • Datastructures - structuring data sequences 6
  • 7. ArrayObject • provides an interface - treat arrays as objects - elements are iteratable 7
  • 8. ArrayObject methods • ArrayObject::append • ArrayObject::__construct • ArrayObject::count • ArrayObject::getIterator • ArrayObject::offsetExists • ArrayObject::offsetGet • ArrayObject::offsetSet • ArrayObject::offsetUnset 8
  • 9. <?php ArrayObject w/o SPL // file: nospl_arrayobject01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); echo quot;Ogres exists ? quot; . (key_exists('ogre', $myArray) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;; echo quot;Ogres equals quot; . $myArray['ogre'] . quot;nquot;; 9
  • 10. <?php ArrayObject Example // file: spl_arrayobject01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); // create an object of the array $arrayObj = new ArrayObject($myArray); echo quot;Ogres exists ? quot; . ($arrayObj->offsetExists(quot;ogrequot;) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;; echo quot;Ogres equals quot; . $arrayObj->offsetGet(quot;ogrequot;) . quot;nquot;; 10
  • 11. ArrayObject Output $ /usr/bin/php ./nospl_arrayobject01.php Ogres exists ? Yes Ogres equals onions Execution time: 0.00064299999999995 microseconds. $ /usr/bin/php ./spl_arrayobject01.php Ogres exists ? Yes Ogres equals onions Execution time: 0.00054399999999999 microseconds. 11
  • 12. Iterator • move back and forth in a stack • distinct methods to access keys and values 12
  • 13. Iterators • ArrayIterator • CachingIterator • RecursiveCachingIterator • DirectoryIterator • RecursiveDirectoryIterator • FilterIterator • LimitIterator • ParentIterator • RecursiveIteratorIterator 13
  • 14. The ArrayIterator iteration methods on array objects 14
  • 15. ArrayIterator Example Case • Array with 3 elements - monkey => bananas, - rabbit => carrots, - ogre => onions • display total elements • display key/value pairs while looping • display key/value pair for 2nd element 15
  • 16. <?php ArrayIterator w/o SPL // file: nospl_iterator01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); echo quot;$myArray has {sizeof($myArray)} elementsnquot;; foreach ($myArray as $key => $value) { echo quot;{$key}: {$value}nquot;; } reset($myArray); next($myArray); echo quot;elem 2:quot; . key($myArray) . quot;: quot; . current($myArray) . quot;nquot;; 16
  • 17. <?php ArrayIterator w/ SPL // file: spl_iterator01.php $myArray = array ( “monkey” => “bananas”, “rabbit” => “carrots”, “ogre” => “onions”, ); $arrayObj = new ArrayObject($myArray); $iterator = $arrayObj->getIterator(); echo quot;$myArray has {$arrayObj->count()} elementsnquot;; while ($iterator->valid()) { echo quot;{$iterator->key()}: {$iterator->current()}nquot;; $iterator->next(); } $iterator->seek(1); echo quot;elem 2:{$iterator->key()}: {$iterator->current()}nquot;; 17
  • 18. ArrayIterator Output $ /usr/bin/php ./nospl_iterator01.php $myArray has 3 elements monkey: bananas rabbit: carrots ogre: onions elem 2:rabbit: carrots Execution time: 0.0020509999999999 microseconds. $ /usr/bin/php ./spl_iterator01.php $myArray has 3 elements monkey: bananas rabbit: carrots ogre: onions elem 2:rabbit: carrots Execution time: 0.001346 microseconds. 18
  • 19. Interfaces • Countable - provides an internal counter • SeekableIterator - provides an internal stack seeker 19
  • 20. <?php Countable Example //file: spl_countable01.php class TequillaCounter implements Countable { public function count() { static $count = 0; return ++$count; } public function order() { $order = $this->count(); echo ($order > 3 ? quot;Floor!quot; : quot;{$order} tequillaquot;) . PHP_EOL; } } 20
  • 21. Countable continued... $shots = new TequillaCounter(); $shots->order(); $shots->order(); $shots->order(); $shots->order(); Output: $ /usr/bin/php ./countable01.php 1 tequilla 2 tequilla 3 tequilla Floor! 21
  • 22. SPL Exceptions • SPL Exceptions - templates - throw exceptions - common issues • Types of exceptions - LogicExceptions - RuntimeExceptions 22
  • 25. <?php Exceptions Example //file: spl_exception01.php class MyClass { public function giveANumberFromOneToTen($number) { if($number < 1 || $number > 10) { throw new OutOfBoundsException('Number should be between 1 and 10'); } echo $number . PHP_EOL; } } $my = new MyClass(); try { $my->giveANumberFromOneToTen(5); $my->giveANumberFromOneToTen(20); } catch (OutOfBoundsException $e) { echo $e->getMessage() . PHP_EOL; } Output: $ /usr/bin/php ./spl_exception01.php 5 Number should be between 1 and 10 25
  • 26. SPL Functions • class_implements Return the interfaces which are implemented by the given class • class_parents Return the parent classes of the given class • iterator_apply Apply a user function to every element of an iterator • iterator_count Count the elements in an iterator • iterator_to_array Copy the iterator into an array • spl_autoload_call Try all registered __autoload() function to load requested class 26
  • 27. SPL Functions (2) • spl_autoload_functions Return all registered __autoload() functions • spl_autoload_register Register given function as __autoload() implementation • spl_autoload_unregister Unregister given function as __autoload() implementation • spl_autoload Default implementation for __autoload() • spl_classes Return available SPL classes • spl_object_hash Return hash id for given object 27
  • 28. <?php SplFunctions Example interface foo {} interface bar {} class baz implements foo, bar {} class example extends baz {} var_dump(class_implements(new baz)); var_dump(class_implements(new example)); 28
  • 29. Output of SplFunctions array(2) { [quot;fooquot;]=> string(3) quot;fooquot; [quot;barquot;]=> string(3) quot;barquot; } array(2) { [quot;barquot;]=> string(3) quot;barquot; [quot;fooquot;]=> string(3) quot;fooquot; } 29
  • 30. SplFileInfo • SplFileInfo::__construct • SplFileInfo::getLinkTarget • SplFileInfo::getATime • SplFileInfo::getMTime • SplFileInfo::getBasename • SplFileInfo::getOwner • SplFileInfo::getCTime • SplFileInfo::getPath • SplFileInfo::getFileInfo • SplFileInfo::getPathInfo • SplFileInfo::getFilename • SplFileInfo::getPathname • SplFileInfo::getGroup • SplFileInfo::getPerms • SplFileInfo::getInode 30
  • 31. SplFileInfo (2) • SplFileInfo::getRealPath • SplFileInfo::isReadable • SplFileInfo::getSize • SplFileInfo::isWritable • SplFileInfo::getType • SplFileInfo::openFile • SplFileInfo::isDir • SplFileInfo::setFileClass • SplFileInfo::isExecutable • SplFileInfo::setInfoClass • SplFileInfo::isFile • SplFileInfo::__toString • SplFileInfo::isLink 31
  • 32. <?php SplFileInfo Example // use the current file to get information from $file = new SplFileInfo(dirname(__FILE__)); var_dump($file->isFile()); var_dump($file->getMTime()); var_dump($file->getSize()); var_dump($file->getFileInfo()); var_dump($file->getOwner()); //output bool(false) int(1244760945) int(408) object(SplFileInfo)#2 (0) { } int(501) 32
  • 33. Data Structures • Available in PHP 5.3.x - SplDoublyLinkedList ✓ SplStack ✓ SplQueue ✓ SplHeap ✓ SplMaxHeap ✓ SplMinHeap ✓ SplPriorityQueue 33
  • 34. Data Structures Example <?php // file: spl_stack01.php $stack = new SplStack(); $stack->push('Message 1'); $stack->push('Message 2'); $stack->push('Message 3'); echo $stack->pop() . PHP_EOL; echo $stack->pop() . PHP_EOL; echo $stack->pop() . PHP_EOL; Outputs: $ /usr/bin/php ./spl_stack01.php Message 3 Message 2 Message 1 34
  • 35. Not a bridge too far... 35
  • 36. Conclusion SPL can help you solve common PHP issues it’s built-in, so why not use it it requires no “advanced skills” to use 36
  • 37. Only one minor thing... 37
  • 38. Documentation problem • php.net/spl needs more documentation ! • you can help on that part: - see http://elizabethmariesmith.com/2009/02/setting-up-phd-on-windows - you can set up phpdoc on each platform ! - Efnet: #php.doc channel - http://doc.php.net - phpdoc@php.net 38
  • 39. More about SPL... • main SPL documentation: http://php.net/spl • PHPro Tutorials on SPL: http://www.phpro.org/tutorials/Introduction-to-SPL.html • Lorenzo Alberton’s blog: http://www.alberton.info/php_5.3_spl_data_structures.html • http://www.colder.ch/news/01-08-2009/34/splobjectstorage-for- a-fa.html 39
  • 40. License This presentation is released under the Creative Commons Attribution-Share Alike 3.0 Unported License You are free: - to share : to copy, distribute and transmit the work - to remix : to adapt the work Under the following conditions: - attribution :You must attribute the work in the manner specified by the author or licensor - share alike : If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license See: http://creativecommons.org/licenses/by-sa/3.0/ 40
  • 41. Credits Golden Gate Bridge - Felix De Vliegher http://www.flickr.com/photos/felixdv/2883471022/ 41
  • 42. Thank you Find my slides on http://slideshare.net/DragonBe Don’t forget to vote ! http://joind.in/586 42

Editor's Notes

  1. Promotion of SPL
  2. Definition of SPL
  3. SPL functions - base class functions - autoloading functions