Konstrukcje jezykowe

Konstrukcje językowe są elementami wbudowanymi w język, dlatego też kierują się specjalnymi regułami. Najbardziej znaną konstrukcją jest prawdopodobnie echo, służące do wypisywania tekstu na ekran. Należy sobie zdać sprawę, że echo nie jest funkcją, dlatego nie zwraca żadnej wartości. Alternatywnie można skorzystać z print, która, mimo tego że jest również konstrukcją językową, to posiada pewne cechy funkcji – zwraca wartość oraz może być użyta jako część wyrażenia.

echo i print

int print (string $arg)
Jako że nie jest to funkcja, argument $arg można przekazać także bez nawiasów (co tak naprawdę jest zalecane). print() zawsze zwraca w wyniku swojego działania wartość 1.
void echo (string $arg1 [, string $...])
Jak widać echo różni się nieco od swojej kuznki print. Po pierwsze nie zwraca żadnej wartości. Po drugie, nie zawsze można je użyć jako część wyrażenia. Np.
$a = print 'Foo'; // zapis poprawny, wyświetli: Foo
$b = echo 'Bar'; // błąd składni
Z powyższej definicji wynika również, że do echo można przekazać kilka parametrów oddzielonych przecinkami. Jeśli zdecydujemy się na taki zapis, należy pamiętać, że parametry te powinniśmy podać BEZ nawiasów, inaczej dostaniemy błąd składni.

die() i exit()

Inną ważną konstrukcją językową jest die(), będąca tak naprawdę aliasem dla exit().
void die ([string $status])
void exit (int $status)
Powoduje ona przerwanie wykonywania skryptu. Opcjonalnie można podać jej jako argument komunikat, który ma być wypisany zaraz przed zakończeniem, lub liczbę całkowitą (tzw. status wyjściowy programu), która nie zostanie wyświetlona na ekranie, ale zostanie przekazana do procesu, który wywołał nasz skrypt.

array()

Programując aplikacje internetowe niejednokrotnie natrafisz na konieczność użycia tablicy. Jednym ze sposobów stworzenia takowej jest kolejna konstrukcja – array(). Zwraca ona tablicę z podanych parametrów.
array array ([mixed $...])
A oto przykład użycia tej konstrukcji:
$myTable = array("a", "b", "c", "d", "e");
print_r($myTable);
Powyższy kod wyświetli:
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)
Zauważ, że mimo tego, iż nie podaliśmy indeksów tablicy, PHP domyślnie zrobił to za nas. Jak zdefiniować swoje własne indeksy? Poprzez podanie do array() pary: klucz => wartość, czyli:
$myTab = array(1 => 1, 2 => "drugi", 3=>244, 4=>"czwarty", 54, "php","moja_nazwa" => "wartosc",1299 => 65, 34, "moja_nazwa"=>100);
print_r($myTab);
Ten przykład wyświetli:
Array
(
    [1] => 1
    [2] => drugi
    [3] => 244
    [4] => czwarty
    [5] => 54
    [6] => php
    [moja_nazwa] => 100
    [1299] => 65
    [1300] => 34
)

Jest tu kilka ciekawostek. Po pierwsze, przypatrz się dokładnie w jaki sposób PHP indeksuje elementy tablicy, gdy klucze nie są jawnie podane. Zaczynamy od klucza 1, któremu przypisujemy wartość 1. Później jest drugi, trzeci i czwarty klucz wraz z odpowiadającymi im wartościami. Natomiast piąty element podany w array() jest bez klucza. Biorąc pod uwagę, że tablica jest indeksowana od zera (nie od jeden!), natomiast my zaczęliśmy od indeksu numer 1, więc przed jedynką mamy w pewnym sensie wolne miejsce. Co zrobi PHP? Jak widać, tworzy sobie kolejny klucz, ale o wartości 5. Tak, tak. Podczas tworzenia domyślnych kluczy numerycznych PHP sprawdza wartość największego klucza, dodaje do niego wartość jeden i tworzy indeks o powstałym numerze. Widać to dobrze później. Dla elementu o wartości 65 ustalamy indeks 1299, następny element, któremu nie przypisujemy jawnie klucza, ma indeks 1300. Zwróć jeszcze uwagę, że przy podaniu dwóch takich samych kluczy, wartość poprzednia jest nadpisywana (vide klucz „moja_nazwa”). Nie będę się tu na razie więcej rozpisywał, gdyż tablice to tak obszerny temat, że szczegółowo zostaną omówione w osobnym rozdziale poświęconym tylko i wyłącznie im.

isset()

Jedną z najbardziej przydatnych konstrukcji językowych jest isset()
bool isset (mixed $var [, mixed $var1 [, $... ]])
Służy ona do sprawdzania, czy zmienna jest zainicjowana. Zwraca FALSE jeśli zmienna ma wartość NULL. Więcej o sprawdzaniu wartości zmiennych napiszę w osobnym wpisie Porównywanie i sprawdzanie wartości zmiennych, bo myślę, że jest to dość ważna sprawa i wcale nie taka prosta, jakby się mogło wydawać. Jak widać, do isset() można przekazać więcej niż jeden parametr. isset() zwróci TRUE tylko wtedy, kiedy wszystkie przekazane wartości będą ustawione. Jako że jest to konstrukcja językowa, a nie funkcja, trzeba pamiętać, że nie można się do niej odnieść za pomocą zmiennej. Np.
$a = 5;
$b = "isset";
$b($a); // wyświetli komunikat o błędzie: "Fatal error: Call to undefined function isset()..."

empty()

Podobne zastosowanie do powyższej ma konstrukcja empty(). Jak sama nazwa wskazuje, sprawdzamy nią czy zmienna jest pusta. Mogłoby się wydawać, że jest ona przeciwieństwem isset(), tak jednak nie jest, o czym więcej powiem w Porównywaniu i sprawdzaniu wartości zmiennych.
bool empty (mixed $var)
Można powiedzieć natomiast, że empty() jest przeciwieństwem boolowskiego if($var). Oto list wartości, które są postrzegane jako puste (czyli dla których empty() zwróci TRUE): „” lub (pusty string) 0 (0 jako int) „0″ (0 jako string) NULL FALSE array() (pusta tablica) var $var (zmienna zadeklarowana, ale bez żadnej przypisanej wartości)
Uwaga dla tych, którzy orientują się już co nieco w programowaniu obiektowym. Od PHP 5 obiekty nieposiadające żadnych właściwości nie są postrzegane jako puste.

list()

Ciekawą i również w niektórych sytuacjach przydatną konstrukcją jest list():
array list (mixed $varname [, mixed $...])
Używana jest do przypisania kilku zmiennych w jednej operacji.
$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special."; // wyświetli: coffee is brown and caffeine makes it special.
 
// można też użyć list() do przypisania tylko kilku zmiennych
list($drink, , $power) = $info;
echo "$drink has $power."; // wyświetli: coffee has caffeine
Konstrukcja ta zwraca tablicę przypisanych wartości.

include, require, include_once i require_once

Czasami zachodzi potrzeba dołączenia do skryptu jakiegoś zewnętrznego pliku. W tym wypadku z pomocą przychodzą nam aż cztery konstrukcje działające bardzo podobnie. Są to: include, include_once, require i require_once. Jak jest różnica między include a require? Taka sama jak między include_once, a require_once ;) A poważnie mówiąc, konstrukcja include dołącza zewnętrzny plik na podstawie ścieżki do pliku, którą jej przekazujemy. Na tym etapie require działa tak samo. Jednak gdy plik nie zostanie odnaleziony, include wygeneruje WARNING i nie przerwie działania skryptu, podczas gdy require wygeneruje FATAL_ERROR i przerwie wykonywanie skryptu (jak sama nazwa wskazuje, require = wymagaj). Pliki dołączane są na podstawie ścieżki – relatywnej, albo bezwzględnej – lub jeśli nie jest ona podana, szukane są w katalogu, na który wskazuje ścieżka include_path zdefiniowana w pliku php.ini. Jeśli i tam nie znajdzie pliku, skrypt ostatecznie szuka pliku w katalogu, z którego został wywołany. Podczas gdy plik jest dołączany, skrypt przechodzi z trybu PHP do trybu HTML, dołącza plik, wykonuje go i na końcu znowu przechodzi do trybu PHP dlatego jeśli w dołączanym pliku znajduje się jakiś kod PHP pamiętajmy, aby umieścić go w znacznikach: <?php ?> include_once i require_once działają prawie identycznie z tą różnicą, że przed dołączeniem pliku, skrypt sprawdza, czy dany plik nie był dołączony wcześniej. Jeśli był, nie dołączy go drugi raz.

eval()

mixed eval (string $code_str)
Konstrukcja eval() traktuje łańcuch znakowy jak kod PHP i wykonuje go. Jest to przydatne w przypadku kiedy np. przechowujemy w bazie danych kod do późniejszego wykonania w postaci tekstu. Przykład działania:
$a = 5;
$b = 1;
 
eval('if($b == 1) $a = 10;');
 
echo $a; // wypisze: 10
eval() zwraca NULL chyba, że w wykonywanym kodzie nastąpiło wywołanie return – wówczas zostanie zwrócona wartość przekazana do return. W przypadku błędu eval() zwraca FALSE.

return

Jeśli return zostanie wywołane z wnętrza funkcji, konstrukcja natychmiastowo przerwie jej działanie i zwróci wartość podaną w argumencie. return kończy również wykonywanie instrukcji eval(), lub ogólnie skryptu. Przykład return w funkcji:
 
function myFoo() {
// jakieś operacje
return 5;
// wszystkie operacje napisane poniżej return nie zostaną wykonane
}
Przykład zakończenia skryptu:
 
// jakieś operacje
 
return 0;
 
// jakieś inne operacje - nie zostaną wykonane
Powyższy przykład ilustruje wywołanie return w przestrzeni globalnej skryptu. A teraz wyobraź sobie taką sytuację. Do skryptu foo.php dołączyłeś inny skrypt bar.php. W pliku bar.php jest wywołanie return w przestrzeni globalnej. Czy takie wywołanie zakończy wykonanie obu skryptów, czy tylko tego, który dołączyliśmy? Myślę, że pytanie dobre na egzamin ZCE ;) Otóż zostanie zakończony tylko skrypt bar.php a sterowanie zostanie oddane z powrotem do skryptu dołączającego. Dodatkowo, jeśli w skrypcie bar.php podaliśmy do return jakiś argument, wówczas będzie on wartością zwróconą przez instrukcję dołączającą. Np: foo.php
$a = include 'bar.php';
bar.php
// cośtam sobie robimy...
 
return 10;
W takim wypadku wartość zmiennej $a w pliku foo.php przyjmie wartość 10. Jako że return jest konstrukcją językową, a nie funkcją, możemy pominąć nawiasy podczas jej wywołania i szczerze mówiąc, jest to zalecane, gdyż PHP ma wtedy mniej pracy podczas parsowania skryptu. Jeśli natomiast nie zwracamy żadnej wartości (chcemy po prostu zakończyć funkcję), wtedy nawiasy muszą być ominięte. Taki zapis: return(); wygeneruje błąd. Uważaj podczas zwracania tablic za pomocą return. Tablica przed zwróceniem powinna być zawsze zadeklarowana. Popatrz na poniższy kod:
function myFoo()
{
    return $a['foo'] = 'bar';
}
 
$a = myFoo();
var_dump($a);
Wynikiem działania będzie: string(3) "bar"

,

One Response to “Konstrukcje jezykowe”

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">