PHP SPL (Standart PHP library)

Така се случи, че преди няколко дни прибягнах до „услугите“ на въпросната библиотека. Бях забравил колко полезни неща има там и реших, че е добра идея да напиша нещо по въпроса. Разширението е достъпно от версия 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 и други.

Сподели:
Edno23 Favit Svejo Twitter Facebook Google Buzz Delicious Google Bookmarks Digg
Публикувано в PHP. Постоянна връзка.

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *

*

Можете да използвате тези HTML тагове и атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>