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...";

}

Stahovat můžete zde.