Třída String v PHP
Začalo mi vadit, že jsem si musel pamatovat všechny ty speciální funkce pro práci s řetězci a zároveň, že nepodporují kódování UTF-8. Co si budeme povídat, člověk občas zapomene použít mb_ variantu. Proto jsem se nechal inspirovat třídou String v Javě a pokusil se implementovat něco podobného v PHP. Chtěl jsem vytvořit něco, co se bude používat jako standartní řetězce v PHP s přidanou objektovou hodnotou.
Druhá moje myšlenka byla, aby se třída dala instancovat, ale zároveň šla používat i staticky, když by se jí vždy potřebný řetězec předal. Tady jsem trochu narazil a byl jsem nakonec nucet udělat třídy dvě. Pokud zavolám nestatickou metodu staticky, vyhodí PHP (alespoň verze 5.3) strict vyjímku. Statickou funkci sice lze z instancované třídy zavolat, ale docela logicky se jí nepředá kontext třídy. Vše jsem chtěl vyřešit pomocí magických funkcí __call a __callStatic, ale nakonec jsem od toho upustil. Chtěl jsem, aby moje IDE napovídalo všechny použitelné metody a takhle bych o tuto vlastnost přišel. Takže nakonec vznikla třída String a statická třída SString. Přitom SString není pouhou kopií String, ale jsou v ní použe staticky využitelné funkce.
Podívejme se teď na využití třídy String. Když chceme vytvořit nový řetězec, použijeme:
$string = new String("Testovací řetězec");
Konstruktor třídy String má dva parametry. První povinný je samotný řetězec a druhý nepovinný je kódování. Zadat ho musíte pouze pokud je jiné než UTF-8.
Od teď už s proměnou $string pracujeme jako s obyčejným řetězcem. Můžeme ho vypisovat, porovnávat (z pochopitelných důvodů pouze pomocí == a ne pomocí ===) a vůbec s ním dělat vše, co s normálním řetězcem.
Teď se ovšem podívejme na onu přidanou hodnotu, kterou jsem zmiňoval na začátku. Většina funkcí je převzata z Javové třídy String a i použití je obdobné. Podívejme se na příkad:
echo $string->length(); // Vypíše délku řetězce
echo $string->toUpperCase->substring(2, 4); // Vypíše ST
if($string->startsWith('Test')) {
echo "Řetězec začíná na Test...";
}
Nebudu zde vypisovat všechny možné funkce, které můžete použít, najdete je popsané přímo ve třídě. Vypíchnu ještě dvě vlastnosti. Třída implementuje rozhraní Iterator a ArrayAccess, proto můžete používat i následující konstrukce:
// Procházení řetězce pomocí foreach
foreach($string as $position => $char) {
echo $char . " at " . $position . "\n";
}
// Práce s řetězcem jako s polem
echo $string[5]; // Vypíše v
$string[5] = 'X'; // Změní pátý znak na X
unset($string[5]); // Vypustí pátý znak z řetězce
Poslední funkce, na kterou bych rád upozornil je encode. Pokud ji zavoláte bez parametrů, vrátí použité kódování. Pokud jí předáte nové kódování, vrátí String v novém kódování.
Statická třída SString, funguje na podobném principu, akorát jako první parametr přebírá vždy řetězec, na který se má funkce aplikovat a jako poslední většinou použité kódování, které je opět potřeba zadat pouze pokud se liší od UTF-8.
echo SString::length("Test..."); // Vypíše délku řetězce
echo SString::toUpperCase("tohle bude velké");
if(SString::startsWith("Testovací string...", 'Test')) {
echo "Řetězec začíná na Test...";
}
| Vytisknout | Tento příspěvek napsal forrest79, 06. 12. 2009 v 22:01 do rubriky PHP, Programování. Můžete sledovat komentáře na tento článek pomocí RSS 2.0. Můžete taktéž zanechat komentář nebo odkázat z Vašeho vlastního webu. |