Така се случи, че преди няколко дни прибягнах до „услугите“ на въпросната библиотека. Бях забравил колко полезни неща има там и реших, че е добра идея да напиша нещо по въпроса. Разширението е достъпно от версия 5.0 на PHP и по подразбиране е включено, въпреки това има възможност да се забрани. С версия 5.3 това ще отпадне, т.е. SPL ще е винаги достъпен за ползване. Част от нещата които предлага и които ми се струват изключително полезни са DirectoryIterator и spl_autoload_register функцията.
Ето как се извежда съдържанието на дадена директория с opendir():
[geshi lang=php]
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo „filename: $file : filetype: “ . filetype($dir . $file) . „\n“;
}
closedir($dh);
}
А ето как става това със SPL и DirectoryIterator:
$dir = new DirectoryIterator(‘.’);
foreach ($dir as $file) {
echo ‘filename: ‘ . $file->getFilename() . ‘ filetype: ‘ . $file->getType() . „\n“;
}
[/geshi]
Друга глезотия е възможността за дефиниране на няколко __autoload() функции с spl_autoload_register().
[geshi lang=php]
class Loader {
// Loads lib A
public static function register_a($class) {
$file = ‘A’ . $class . ‘.php’;
if (is_file($file)) {
include $file;
}
}
// loads lib B
public static function register_b($class) {
$file = ‘B’ . $class . ‘.php’;
if (is_file($file)) {
include $file;
}
}
}
spl_autoload_register(‘Loader::register_a’);
spl_autoload_register(‘Loader::register_b’);
[/geshi]
Създаваме клас Loader, който ще зарежда необходимите ни библиотеки. В класа има два метода, един за библиотеката A и един за библиотеката B. Ще „напълним“ и библиотеките със съдържание създавайки четири файла: ATest.php, ATest2.php, BTest2.php и BTest3.php:
[geshi lang=php]
class Test {
public function __construct() {
echo 'Lib A Class ' . \_\_CLASS\_\_;
}
}
?>
class Test2 {
public function __construct() {
echo 'Lib A Class ' . \_\_CLASS\_\_;
}
}
?>
class Test2 {
public function __construct() {
echo 'Lib B Class ' . \_\_CLASS\_\_;
}
}
?>
class Test3 {
public function __construct() {
echo 'Lib B Class ' . \_\_CLASS\_\_;
}
}
?>
[/geshi]
След като сме готови си създаваме и примерен обект:
[geshi lang=php]
$c = new Test2();
[/geshi]
Ето и резултата:
Lib A Class Test2
Изпълнява се autoload функцията и се зарежда файла. Понеже първо е дефинирана Loader::register_a, първо тя се изпълнява и тъй като намира клас с такова име (Test2) въобще не се стига до изпълнението на Loader::register_b.
Хубаво е да се разгледа SPL, защото има и други неща, които в даден момент може да се окажат доста полезни. Иска ми се да спомена само, че SPL extend-ва Exception класа давайки ни възможност да използваме още Exceptions: LogicException, RuntimeException, InvalidArgumentException и други.