czwartek, 8 listopada 2012

PHP i JavaScript. Część 2 - Wyjście, string i zmienne





W drugiej części kursu rozwinę to co poruszyłem w pierwszej części z pomocą Hello World. Głównym tematem pozostaje wypisanie tesktu. Jak już wiemy jest na to kilka sposobów, ale nie poznaliśmy ich wszystkich cech w czym pomoże zapoznanie się z zmiennymi w PHP i JavaScript.

Wpis z cyklu Tutorial PHP i JavaScript.




PHP

Nazwy zmiennych w PHP rozpoczynają się znakiem $
$variable;
Nie dotyczy to zmiennych obiektów
$Object->variable;
$this->variable;
gdzie nazwa poprzedzona jest referencją obiektu i ->.
Deklaruje się je przypisując im wartość
$var = '';
$var2 = $var1;
Na tym polu zmienne obiektów znowu się wyróżniają, bo nie wymagają wartości, ale szczegółowiej to opiszę przy okazji omawiania OOP.
Skomplikujmy Hello World
$a = 'Hello';
$b = 'World';
echo '" . $a . ' ' . $b . '"';
Wygląda to trochę zagmatwanie jak na coś tak prostego, ale wykorzystanie podwójnego cudzysłowu uprości kod wizualnie choć trochę spowolni
$a = 'Hello';
$b = 'World';
echo "\"$a $b\"";
Żeby skrypt wykonał się poprawnie postawiłem escape, ten sam zabieg można dokonać przy single-quote
$a = 'Hello';
$b = 'World';
echo '\'';
Wykorzystanie tej notacji daje dostęp także do innych sekwencji specjalnych. Powinno się jej jednak unikać chociażby w imię wydajności, która spada kiedy silnik PHP musi dodatkowo sparsować tekst w poszukiwaniu zmiennych. Kolejną cechę można zilustrować sytuacją kiedy chcemy napisać świat w liczbie mnogiej
$a = 'Hello';
$b = 'World';
echo "$a $bs";
Wynik jest niepoprawny, bo parser szuka zmiennej $bs. Problem ten rozwiązują nawiasy klamrowe
$a = 'Hello';
$b = 'World';
echo "$a {$b}s";
Heredoc daje te same możliwości, ale z tą różnicą, że nie trzeba już escape`ować cudzysłowu.
$a = 'Hello';
$b = 'World';
echo <<<EOT
"$a $b"
EOT;
W Nowdoc z kolei realizacja naszego skryptu jest już karkołomna, bo wewnątrz ciągu nie może pojawić się zmienna.
Nie wspominałem jeszcze o tablicach i kiedy indziej to zrobię, ale do jej elementów odwołuje się w ten sposób
$array[ 0 ];
Gdzie 0 to klucz elementu. Wspominam teraz o tym, bo to samo można robić w PHP z łańcuchami znaków
$hello = 'world';
echo $hello[ 1 ];
Zostanie wyświetlona druga litera, czyli o. Pamiętaj że programista zawsze liczy od 0!

JavaScript

Deklaracja zmiennej zachodzi w bardziej sformalizowany sposób i także nie wymaga nadania wartości
var a = '';
var b = '';
var c; 
Można to także zapisać w ten sposób
var a = b = '';
var c; 
lub mój ulubiony
var a = '',
b = '',
c;
Jest on jednak krytykowany ze względy na to, że zgubienie przecinka może narobić bałaganu.
Kwestię zmiennych obiektów teraz pominę.
Double-quote zachowuje się tak samo jak single-quote, preferuję jednak ten drugi, jako lżejszy. Złożoną wersję Hello World można zrealizować zasadniczo w jeden sposób
var a = 'hello',
b = 'world';
console.log( '"' + a + ' ' + b '"' );
Co może dziwić JavaScript nie pozwala na proste, wieloliniowe łańcuchy teksty. Kolejne linie trzeba zapisać osobno, a następnie połączyć
console.log( 'hello world, hello world, hello world, hello world, hello world' +
'hello world, hello world, hello world, hello world, hello world, hello world' +
'hello world, hello world, hello world, hello world, hello world, hello world' );
Lecz ten sposób jest niepolecany ze względu na spadającą wydajność przy łączeniu. Można escape`ować nowe linie,
console.log( 'hello world, hello world, hello world, hello world, hello world \
hello world, hello world, hello world, hello world, hello world, hello world \
hello world, hello world, hello world, hello world, hello world, hello world' );
ale są wątpliwości co do kompatybilności.
Póki co najwłaściwszym rozwiązaniem jest łączenie elementów tablicy
console.log( [ 'hello world, hello world, hello world, hello world, hello world',
'hello world, hello world, hello world, hello world, hello world, hello world',
'hello world, hello world, hello world, hello world, hello world, hello world' ] );

W kolejnym wpisie na przykładzie klasycznego foo-bar omówię pozostałe typy danych, ich rzutowanie i może coś więcej.

Update 13:40
Michał ma rację: zmienne w JavaScript nie wymagają wartości przy deklaracji. Zamiast zawierzyć doświadczeniu nabrałem siebie pozornie dobrze skonstruowanym testem
var y;
typeof x === typeof y; // true, undefined
W tym przypadku x jest oczywiście niezdefiniowany, ale y już tak, choć bez zdefiniowanej wartości.