Czy można zrobić “text templates” bez użycia systemu dedykowanych znaczników i zastępowania tekstu? (cz. 2)
Nasz problem rozwiążemy korzystając z “single quoted strings”. Dzięki temu nie będzie potrzeby deklarowania zmiennych przed wystąpieniem takiego łańcucha:
$templateMessage = 'Witaj {$kto}! {$serv} zaprasza do korzystania ze swoich usług';
Ten zwykły text po wyświetleniu na ekranie za pomocą funkcji echo da dokładnie to co w nim jest zawarte.Przystępujemy teraz do tworzenia funkcji-serca naszego podsystemu, która zwróci tekst zawarty w zmiennej globalnej o podanej nazwie uzupełniając w niej odpowiednie pola wartościami zmiennych.
/* varMap ma postać "nazwa_zmiennej" => wartość
*/
function getMsg($templateVariableName, $varMap)
{
global $$templateVariableName;
$templateRef = &$$templateVariableName;
foreach($varMap as $varName => $varValue)
$$varName = $varValue;
eval("\\$result = \\"{$templateRef}\\";");
return $result;
}
Funkcja rozpoczyna się od deklaracji zmiennej, której nazwa znajduje się w $templateVariableName (tzw. “zmienna zmienna”), jako globalnej. Jest to konieczne ponieważ zmienne zawierające tekst do wypisania są globalne i normalnie nie są dostępne w ciele funkcji. Następnie tworzymy lokalną zmienną $templateRef, w której będziemy przechowywać referencję do globalnej zmiennej zawierającej tekst do wypisania. Korzystamy z referencji, aby nie wykonywać lokalnej kopii łańcucha znaków. Mogłoby to pogorszyć wydajność podczas korzystania z długich łańcuchów lub ich wielokrotnego przetwarzania. Następnym krokiem jest utworzenie lokalnych zmiennych o nazwach i wartościach przekazanych w tablicy asocjacyjnej $varMap. Będą one podstawione podczas wykonywania funkcji eval w miejscach wystąpienia w tekstcie referencji do zmiennych (nazwy zmiennych otoczone klamrami) - popatrz “double quoted strings”.
Szczególnego wyjaśnienia wymaga funkcja eval. Powoduje ona wykonanie kodu PHP przekazanego jako łańcuch znaków w argumencie. W naszym przypadku nastąpi wykonanie następującego kodu:
$result = "Witaj {$kto}! {$serv} zaprasza do korzystania ze swoich usług";
Pojawi się we funkcji nowa zmienna ($result) będąca poszukiwanym przez nas wynikiem. Zauważ, że łańcuch zmienił się z “single quoted” na “double quoted”. Nie wiem czy dałoby się to zrobić za pomocą zwykłych przypisań. Wspomniana funkcja przelicza fizycznie to wyrażenie.
Nadszedł wreszcie czas aby przetestować działanie naszego mechanizmu dodając na końcu skryptu tych oto kilka linii:
echo(getMsg("templateMessage", array("kto" => "Rafale", "serv" => "Serwis e-Programowanie.pl")));
echo(getMsg("templateMessage", array("kto" => "Mikołaju", "serv" => "Serwis wp.pl")));
echo(getMsg("templateMessage", array("kto" => "Jędrzeju", "serv" => "Serwis onet.pl")));
rys.1 Wynik działania skryptu.
Tags: PHP

Najświeższe komentarze