This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Zazwyczaj podczas tworzenia klas implementuję w nich własne metody “podsumowujące” aktualny stan obiektu. W zdecydowanej większości przypadków to, co sam stworzę jest o wiele wygodniejsze w czytaniu niż np. wynik funkcji var_dump(). ;] Do tej pory podczas tworzenia takich metod korzystałem wyłącznie z konstrukcji echo i jej podobnych, jednak tym razem zdecydowałem się na ułatwienie sobie pracy i wykorzystanie składni HEREDOC, o której wcześniej tylko czytałem, a nie miałem okazji sprawdzić jej faktycznej przydatności.

Wstęp.

Tym, którzy powyższą nazwę słyszą po raz pierwszy polecam lekturę manuala PHP, gdzie wszystko zostało dokładnie i całkiem przystępnie przedstawione. Zwykle kiedy chcemy wpisać bezpośrednio w kodzie długi literał mamy do wyboru praktycznie tylko wieloliniowy string ograniczony apostrofem lub cudzysłowem [pojedynczym lub podwójnym “ciapkiem” ;]], co nie jest zbyt wygodne, ze względu na to, że kolejne linie trzeba kończyć specjalnie wpisanymi kombinacjami kodów znaków \n i \r - zależnie od docelowego systemu operacyjnego. Z pomocą przychodzi mechanizm obecny w języku PHP od wersji 4.3.0, czyli wspomniany wcześniej HEREDOC:

1
2
3
4
5
6
7
8
$tmp = 42;
$var = <<<EOT
bardzo długi string z wieloma znakami
i wieloma liniami
a nawet zmienną udałoby się tutaj wrzucić
proszę bardzo: $tmp
powinno działać ;]
EOT;

Prawda, że wygodne [a nawet czytelne]?

Problem i rozwiązanie.

Jak zwykle jednak podczas wdrażania nowego rozwiązania pojawiają się problemy, z którymi wcześniej nie mieliśmy do czynienia. Tym razem trudności pojawiły się w momencie, kiedy zechciałem wstawić w bloku wywołanie funkcji, a dokładniej metody:
1
2
3
4
5
6
7
$var = <<<EOT
bardzo długi string z wieloma znakami
i wieloma liniami
a nawet funkcję udałoby się tutaj wrzucić
proszę bardzo: $this->method() <- niestety nie do końca ;]
powinno działać ;]
EOT;

Okazało się, że interpreter widzi wszystko poza nawiasami okrągłymi, co powoduje błąd [obiekt jest instancją klasy CClass]:

1
Notice:  Undefined property: CClass::$method in [path] on line [line]

Po chwili szukania informacji na ten temat u wujka Google natrafiłem na rozwiązanie: otóż, każdy złożony konstrukt (wywołanie funkcji lub metody) musi być ograniczony nawiasami klamrowymi - podobnie jak przy wywoływaniu metody poprzez variable function:

1
2
$method = 'functionName';
$this->{$method}();

W związku z czym odpowiednie wywołanie składni HEREDOC brzmi następująco:

1
2
3
4
5
6
7
$var = <<<EOT
bardzo długi string z wieloma znakami
i wieloma liniami
a nawet funkcję udałoby się tutaj wrzucić
proszę bardzo: {$this->method()} <- teraz już działa
powinno działać ;]
EOT;

Podsumowanie.

Tak jak wspomniałem na początku tego wpisu, po raz pierwszy miałem okazję na poważnie użyć składni HEREDOC, a w Internecie panuje ogólnie negatywna opinia na temat tego typu konstrukcji - programiści uważają ją raczej za "zabawkę" i funkcjonalność raczej zaciemniającą a nie upraszczającą kod. Stąd moje pytanie do Was - co sądzicie na temat stosowania bloków HEREDOC [i NOWDOC] w kodzie? Czy stosujecie to często, rzadko, a może dopiero ten wpis uświadomił Wam istnienie tego typu możliwości?

Poza tym, wolne chwile kilku ostatnich dni spędziłem na pracy nad obiektową wersją jednej z bibliotek PHP - myślę, że korzystanie z niej będzie o wiele wygodniejsze niż pozwala na to aktualny, składający się wyłącznie z funkcji interfejs. Mam nadzieję, że w niedalekiej przyszłości będę mógł udostępnić ją publicznie - jednak wszystko zależy od ilości czasu, który będę musiał poświęcić na naukę, ponieważ niestety maj i czerwiec najprawdopodobniej upłyną pod znakiem zaliczeń i egzaminów na studiach, a którego siłą rzeczy nie wykorzystam na dopracowanie kodu.