← Tilbage til koncepter
Standard PHP Library (SPL)
Built-in collection af interfaces, classes og functions til iteration, data structures og exceptions
Kategori: Fundamentals
🎯 Key Points
- ✓ArrayIterator - Iterator wrapper omkring arrays med tilføjet funktionalitet
- ✓FilterIterator - Filter items during iteration baseret på custom logic
- ✓DirectoryIterator - Iterate over filesystem directories og files
- ✓RecursiveIteratorIterator - Iterate recursively gennem nested structures
- ✓SplStack - Last-In-First-Out (LIFO) data structure implementation
- ✓SplQueue - First-In-First-Out (FIFO) data structure implementation
- ✓SplHeap - Heap data structure for priority queues
- ✓SplObjectStorage - Map objects to data eller create object sets
- ✓SPL Exceptions - Specialized exception types (InvalidArgumentException, LogicException, etc)
- ✓Iterator interfaces - SeekableIterator, RecursiveIterator, OuterIterator
- ✓Countable & ArrayAccess - Interfaces for array-like behavior på objects
- ✓spl_autoload_register - Register autoloader functions for class loading
💻 Kode Eksempel
<?php
// SplStack - LIFO data structure
$stack = new SplStack();
$stack->push('Bottom');
$stack->push('Middle');
$stack->push('Top');
echo "Stack (LIFO):\n";
while (!$stack->isEmpty()) {
echo $stack->pop() . "\n"; // Top, Middle, Bottom
}
// SplQueue - FIFO data structure
$queue = new SplQueue();
$queue->enqueue('First in line');
$queue->enqueue('Second in line');
$queue->enqueue('Third in line');
echo "\nQueue (FIFO):\n";
while (!$queue->isEmpty()) {
echo $queue->dequeue() . "\n"; // First, Second, Third
}
// Custom FilterIterator
class EvenNumberFilter extends FilterIterator {
public function accept(): bool {
return $this->current() % 2 === 0;
}
}
$numbers = new ArrayIterator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
$evenNumbers = new EvenNumberFilter($numbers);
echo "\nEven numbers only:\n";
foreach ($evenNumbers as $num) {
echo $num . " ";
}
echo "\n";
// SplObjectStorage - Object-to-data mapping
$storage = new SplObjectStorage();
class Product {
public function __construct(public string $name) {}
}
$laptop = new Product('Laptop');
$mouse = new Product('Mouse');
$storage[$laptop] = ['price' => 1000, 'stock' => 5];
$storage[$mouse] = ['price' => 25, 'stock' => 50];
echo "\nProduct inventory:\n";
foreach ($storage as $product) {
$data = $storage[$product];
echo "{$product->name}: \${$data['price']} ({$data['stock']} in stock)\n";
}
// SPL Exceptions
function divideNumbers(float $a, float $b): float {
if ($b === 0.0) {
throw new InvalidArgumentException('Division by zero is not allowed');
}
return $a / $b;
}
try {
echo "\n10 / 2 = " . divideNumbers(10, 2) . "\n";
echo "10 / 0 = " . divideNumbers(10, 0) . "\n";
} catch (InvalidArgumentException $e) {
echo "Error: {$e->getMessage()}\n";
}
// ArrayIterator with advanced features
$data = ['apple', 'banana', 'cherry', 'date'];
$iterator = new ArrayIterator($data);
echo "\nArrayIterator with seek:\n";
$iterator->seek(2); // Jump to index 2
echo "Current: {$iterator->current()}\n";
echo "Count: {$iterator->count()}\n";💼 Hvornår bruges det?
- •Custom iterators til collections hvor du vil kontrollere iteration behavior (pagination, filtering)
- •File system operations med DirectoryIterator og RecursiveDirectoryIterator til folder scanning
- •Task queues og job processing med SplQueue for first-in-first-out message handling
- •Undo/redo functionality implementeret med SplStack for command pattern
- •Object registries og service locators med SplObjectStorage til object-to-metadata mapping
- •Priority queues i scheduling systems hvor tasks processeres baseret på prioritet (SplPriorityQueue)
⭐ Best Practices
- ✓Prefer SPL data structures over arrays når du har specifike use cases (stack, queue, heap)
- ✓Extend FilterIterator for reusable filtering logic i stedet for array_filter
- ✓Brug SPL exceptions for mere præcis error handling - InvalidArgumentException vs generic Exception
- ✓Kombiner SPL iterators med generator functions for memory-efficient data processing
- ✓Implement Countable og ArrayAccess interfaces for at give objects array-like behavior
- ✓Brug SplObjectStorage når du skal mappe objects til data uden at modificere object selv
- ✓Type hint SPL interfaces (Iterator, Countable) for bedre flexibility og testability
- ✓Cache SPL iterator instances når samme iteration sker multiple gange for performance
ℹ️ Quick Info
Kategori
Fundamentals
Sværhedsgrad
Mellem til Avanceret