Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dark Corners Of The SPL - Dallas PHP July

Dark Corners Of The SPL - Dallas PHP July

PHP is a huge language, with lots of "kitchen sink" functionality for you to build data structures with. But did you know PHP includes a standard library that has built-in structures like linked lists, queues, stacks, and higher-performance arrays? This talk will cover a few of the more interesting ones in depth, including how to use them and most importantly why you'd use them over other solutions.

Omni Adams

July 10, 2018
Tweet

More Decks by Omni Adams

Other Decks in Programming

Transcript

  1. Big-O O(1) - Constant no matter how big your data

    O(log n) - Grows slowly with your data O(n) - Grows linearly with your data O(n2) - Grows quadratically with your data O(2n) - Grows exponentially with your data O(n!) - LOL
  2. $list->push('Echo'); foreach ($list as $key => $character) { echo $key,

    ' ', $character, PHP_EOL; } echo PHP_EOL; 0 Ash 1 Bingo 2 Charlie 3 Echo
  3. 0 Ash 1 Bingo 2 Charlie 3 Echo $list->add(3, 'Delta');

    foreach ($list as $key => $character) { echo $key, ' ', $character, PHP_EOL; } echo PHP_EOL;
  4. foreach ($list as $key => $character) { echo $key, '

    ', $character, PHP_EOL; } echo PHP_EOL; 0 Ash 1 Bingo 2 Charlie 3 Delta 4 Echo
  5. 2 Charlie 3 Delta 4 Echo $list->rewind(); echo sprintf( "It's

    %s's turn! They take out %s!", $list->current(), $list[2] ), PHP_EOL; $list->offsetUnset(2); foreach ($list as $key => $character) { echo $key, ' ', $character, PHP_EOL; } echo PHP_EOL;
  6. foreach ($list as $key => $character) { echo $key, '

    ', $character, PHP_EOL; } echo PHP_EOL; It's Ash's turn! They take out Charlie! 0 Ash 1 Bingo 2 Delta 3 Echo
  7. class Character { public $name; public $initiative; public function __construct(

    string $name, int $init ) { $this->name = $name; $this->initiative = $init; } }
  8. class InitiativeHeap extends SplMaxHeap { public function compare($a, $b) :

    int { return $a->initiative - $b->initiative; } }
  9. $init = new InitiativeHeap(); $init->insert(new Character('Ash', random_int(1, 30))); $init->insert(new Character('Bingo',

    random_int(1, 30))); $init->insert(new Character('Charlie', random_int(1, 30))); $init->insert(new Character('Echo', random_int(1, 30))); foreach ($init as $character) { echo sprintf( '%s %d', $character->name, $character->initiative ), PHP_EOL; }
  10. foreach ($init as $character) { echo sprintf( '%s %d', $character->name,

    $character->initiative ), PHP_EOL; } Ash 30 Echo 27 Charlie 16 Bingo 12
  11. $a = [ 'foo' => 1, 'bar' => new StdClass(),

    1 => null, false => true, ]; var_dump($a); array(3) { [“foo"]=>int(1) [“bar"]=>object(stdClass)#1 (0) {} [1]=>NULL [0]=>bool(true) } $b = [ 0 => 10, 2 => 22, PHP_INT_MAX => PHP_INT_MAX, ]; var_dump($b); array(3) { [0]=>int(10) [2]=>int(22) [9223372036854775807]=> int(9223372036854775807) }
  12. $c = new SplFixedArray(3); $c[0] = 10; $c[1] = 20;

    $c[2] = 42; var_dump($c); object(SplFixedArray)#2 (3) { [0]=>int(10) [1]=>int(20) [2]=>int(42) }
  13. $d = new SplFixedArray(3); $d[0] = 10; $d[1] = 20;

    $d[2] = 42; $d[3] = 99; var_dump($d); PHP Fatal error: Uncaught RuntimeException: Index invalid or out of range in SplFixedArray.php:33 Stack trace: #0 {main} thrown in SplFixedArray.php on line 33
  14. $e = new SplFixedArray(3); $e[0] = 10; $e[1] = 20;

    $e[2] = 42; $e->setSize(4); $e[3] = 99; var_dump($e); object(SplFixedArray)#5 (4) { [0]=>int(10) [1]=>int(20) [2]=>int(42) [3]=>int(99) }
  15. $char = new Character(); $storage = []; $storage[$char] = new

    Character(); Warning: Illegal offset type in SplObjectStorage.php on line 3
  16. class Buff {} class Ailment {} $fighter = new Character();

    $mage = new Character(); $goblin = new Enemy(); $ogre = new Enemy(); $haste = new Buff(); $poison = new Ailment();
  17. $encounter = new SplObjectStorage(); $encounter->attach($fighter, [$haste]); $encounter->attach($mage, [$haste, $poison]); $encounter[$goblin]

    = [$poison]; $encounter->attach($ogre); foreach ($encounter as $key => $value) { print_r($key); echo PHP_EOL; print_r($value); } $poison = new Ailment();
  18. foreach ($encounter as $key => $value) { print_r($key); echo PHP_EOL;

    print_r($value); } 0 Character Object() 1 Character Object() 2 Enemy Object() 3 Enemy Object()
  19. print_r($encounter[$key]); } Character Object() // fighter Array( [0] => Buff

    Object() // haste ) Character Object() // mage Array( [0] => Buff Object() // haste [1] => Ailment Object() // poison ) Enemy Object() // golbin Array( [0] => Ailment Object() // poison ) Enemy Object()
  20. class Countable { public function count() : int { return

    42; } } $foo = new Countable(); echo count($foo), PHP_EOL;
  21. class Countable { public function count() : int { return

    42; } } $foo = new Countable(); echo count($foo), PHP_EOL; Warning: count(): Parameter must be an array or an object that implements Countable in Countable.php on line 13 1
  22. object that implements Countable in Countable.php on line 13 1

    class ActuallyCountable implements Countable { public function count() { return 42; } } $bar = new ActuallyCountable(); echo count($bar), PHP_EOL;