slawek Sat Mar 16 18:59:50 2002 EDT
Added files:
/phpdoc/pl/language types.xml
Log:
Types.xml (version EN 1.73) DONE! DONE! DONE! (qrak)
Index: phpdoc/pl/language/types.xml
+++ phpdoc/pl/language/types.xml
<?xml version="1.0" encoding="iso-8859-2"?>
<!-- EN-Revision: 1.73 Maintainer: Qrak Status: ready -->
<!-- $Revision: 1.1 $ -->
<chapter id="language.types">
<title>Typy danych</title>
<sect1 id="language.types.intro">
<title>Wst�p</title>
<simpara>
PHP obs�uguje osiem typ�w prostych.
</simpara>
<para>
Cztery skalarne:
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.boolean">boolowski (boolean)</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.integer">liczba ca�kowita (integer)</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.float">liczba zmiennoprzecinkowa
(float)</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string">�a�cuch znak�w (string)</link>
</simpara>
</listitem>
</itemizedlist>
Dwa typy z�o�one:
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.array">tablica (array)</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.object">obiekt (object)</link>
</simpara>
</listitem>
</itemizedlist>
Oraz dwa typy specjalne:
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.resource">identyfikator zasob�w
(resource)</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.null">NULL (null)</link>
</simpara>
</listitem>
</itemizedlist>
</para>
<note>
<simpara>
W tym podr�czniku cz�sto pojawia si� typ <literal>mixed</literal>. Ten
pseudotyp wskazuje na mo�liwo�� u�ycia danych r�nego typu.
</simpara>
<!--
Just an idea, maybe useful for some func-defs?
(at least it is for the operator-defs)
<simpara>
In parameter definitions you can also encounter the 'number' pseudo-type,
that indicates a parameter that is either <type>integer</type> or
<type>float</type>.
</simpara>
-->
</note>
<simpara>
Typ danych zwykle nie jest ustalany przez programist�. Robi to PHP na
podstawie kontekstu, w jakim zmienna jest u�ywana.
</simpara>
<note>
<simpara>
Aby sprawdzi� typ i warto�� konkretnego <link
linkend="language.expressions">wyra�enia</link>, nale�y u�y� funkcji
<function>var_dump</function>.
</simpara>
<simpara>
Aby mie� czyteln� reprezentacj� typu dla potrzeb debugowania, nale�y u�y�
funkcji <function>gettype</function>. Aby sprawdzi�, czy zmienna jest
jakiego� konkretnego typu, <emphasis>nie</emphasis> u�ywaj funkcji
<function>gettype</function>, tylko grupy funkcji
<literal>is_<replaceable>jaki�_typ</replaceable></literal>.
</simpara>
<!-- TODO: example(s) would be great -->
</note>
<simpara>
Aby narzuci� konwersj� zmiennej do okre�lonego typu, mo�na albo <link
linkend="language.types.typecasting">rzutowa�</link> zmienn�, albo u�y�
funkcji <function>settype</function>.
</simpara>
<simpara>
Prosz� pami�ta�, �e w pewnych sytuacjach zmienne mog� si� zachowywa� r�nie,
w zale�no�ci od tego, jakiego typu s� w danej chwili. Wi�cej informacji
w rozdziale <link
linkend="language.types.type-juggling">wykorzystywanie typ�w danych</link>.
</simpara>
</sect1>
<sect1 id="language.types.boolean">
<title>Zmienne Logiczne (Boolowskie - boolean)</title>
<simpara>
Ten rodzaj jest najprostszy. Typ <type>boolean</type> wyra�a logiczn�
prawd� lub fa�sz. Mo�e mie� warto�ci &true; lub &false;.
</simpara>
<note>
<simpara>
Typ boolowski zosta� wprowadzony w PHP 4.
</simpara>
</note>
<sect2 id="language.types.boolean.syntax">
<title>Sk�adnia</title>
<para>
Aby utworzy� warto�� boolowsk�, nale�y u�y� s��w kluczowych &true; lub
&false;. Wielko�� liter w tych s�owach nie gra roli.
<!-- technically they are just constants -->
<informalexample>
<programlisting role="php">
<![CDATA[
$foo = True; // przypisanie warto�ci logicznej prawda do $foo
]]>
</programlisting>
</informalexample>
</para>
<para>
Ten typ najcz�ciej u�ywany jest przy
<link linkend="language.operators">operatorach</link>, kt�re zwracaj�
warto�� typu <type>boolean</type>, kt�r� nast�pnie przekazuje si�
do <link linkend="control-structures">struktur kontrolnych</link>.
<informalexample>
<programlisting role="php">
<![CDATA[
// == jest operatorem, kt�ry zwraca warto�� boolowsk�
if ($akcja == "poka�_wersj�") {
echo "Wersja 1.23";
}
// to nie jest konieczne:
if ($poka�_separatory == TRUE) {
echo "<hr>\n";
}
// gdy� wystarczy tak:
if ($poka�_separatory) {
echo "<hr>\n";
}
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 id="language.types.boolean.casting">
<title>Konwersja do typu boolowskiego</title>
<simpara>
Aby jawnie skonwertowa� warto�� na typ <type>boolean</type>, nale�y
u�y� rzutowania <literal>(bool)</literal> lub
<literal>(boolean)</literal>. Jednak�e w wi�kszo�ci przypadk�w nie ma
potrzeby u�ycia rzutowania, poniewa� warto�� b�dzie automatycznie
skonwertowana na typ <type>boolean</type>, je�li operator, funkcja lub
struktura kontrolna wymaga argumentu tego w�a�nie typu.
</simpara>
<simpara>
Zobacz te�
<link linkend="language.types.type-juggling">wykorzysytwanie typ�w
danych</link>.
</simpara>
<para>
Przy konwersji na typ <type>boolean</type>, poni�sze warto�ci otrzymuj�
warto�� logiczn� &false;:
<itemizedlist>
<listitem>
<simpara><link linkend="language.types.boolean">boolowski</link>
&false;<!-- duh... --></simpara>
</listitem>
<listitem>
<simpara>liczba <link linkend="language.types.integer">ca�kowita</link
> 0 (zero) </simpara>
</listitem>
<listitem>
<simpara>liczba
<link linkend="language.types.float">zmiennoprzecinkowa</link>
0.0 (zero) </simpara>
</listitem>
<listitem>
<simpara>pusty <link linkend="language.types.string"
>�a�cuch znak�w</link>, oraz <link linkend="language.types.string"
>�a�cuch znak�w</link> "0"</simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.array">tablica</link>
z zerow� liczb� element�w</simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.object">obiekt</link>
z zerow� liczb� element�w</simpara>
</listitem>
<listitem>
<simpara>specjalny typ <link linkend="language.types.null"
>NULL</link> (w��czaj�c niezadeklarowane zmienne)
</simpara>
</listitem>
</itemizedlist>
Ka�da inna warto�� otrzymuje logiczn� warto�� &true; (w��czaj�c w to
<link linkend="language.types.resource">identyfikatory zasob�w</link>).
<warning>
<simpara>
<literal>-1</literal> tak�e ma warto�� &true;, jak ka�da niezerowa
(ujemna lub dodatnia) liczba!
</simpara>
</warning>
<!-- TODO: add a few examples, for the people only looking at
the examples... -->
</para>
</sect2>
</sect1>
<sect1 id="language.types.integer">
<title>Liczby ca�kowite (integer)</title>
<simpara>
Typ <type>integer</type> to liczba ca�kowita, nale��ca do przedzia�u
Z = {..., -2, -1, 0, 1, 2, ...}.
</simpara>
<para>
Zobacz te�:
<link linkend="ref.gmp">Liczby ca�kowite du�ej precyzji</link> oraz
<link linkend="language.types.float">Liczby zmiennoprzecinkowe</link>
</para>
<sect2 id="language.types.integer.syntax">
<title>Sk�adnia</title>
<simpara>
Liczby ca�kowite mog� by� zapisane w notacji dziesi�tnej (opartej na 10),
szesnastkowej (opartej na 16) lub �semkowej (opartej na 8), opcjonalnie
poprzedzone znakiem (- lub +).
</simpara>
<para>
Aby zapisa� liczb� w notacji �semkowej, nale�y poprzedzi� w�a�ciw� liczb�
symbolem <literal>0</literal> (zero). W notacji szesnastkowej liczb�
nale�y poprzedzi� symbolem <literal>0x</literal>.
<example>
<title>Notacja liczb ca�kowitych</title>
<programlisting role="php">
<![CDATA[
$a = 1234; # liczba dziesi�tna
$a = -123; # ujemna liczba dziesi�tna
$a = 0123; # liczba �semkowa (odpowiednik dziesi�tnej 83)
$a = 0x1A; # liczba szesnastkowa (odpowiednik dziesi�tnej 26)
]]>
</programlisting>
</example>
<!--
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
-->
Maksymalna wielko�� liczby ca�kowitej jest zale�na od platformy
operacyjnej, zwykle jest to oko�o dwa miliardy (jest to 32 bity ze
znakiem). PHP nie obs�uguje liczb ca�kowitych bez znaku.
</para>
</sect2>
<sect2 id="language.types.integer.overflow">
<title>Wyj�cie poza zakres liczb ca�kowitych</title>
<para>
W przypadku zapisania liczby ca�kowitej wykraczaj�cej poza zakres typu
<type>integer</type>, liczba ta zostanie potraktowana jako typ
<type>float</type>. R�wnie� je�li rezultat operacji b�dzie wykracza� poza
typ <type>integer</type>, jako wynik zostanie zwr�cony typ
<type>float</type>.
<informalexample>
<programlisting role="php">
<![CDATA[
$du�a_liczba = 2147483647;
var_dump($du�a_liczba);
// wynik: int(2147483647)
$du�a_liczba = 2147483648;
var_dump($du�a_liczba);
// wynik: float(2147483648)
// tak samo dzieje si� przy warto�ciach szesnastkowych:
var_dump( 0x80000000 );
// wynik: float(2147483648)
$million = 1000000;
$du�a_liczba = 50000 * $million;
var_dump($du�a_liczba);
// wynik: float(50000000000)
]]>
</programlisting>
</informalexample>
<warning>
<simpara>
Niestety, b��d w PHP powodowa� czasem nieprawid�ow� prac� z liczbami
ujemnymi. Na przyk�ad: wynikiem dzia�ania <literal>-50000 *
$million</literal> by�a liczba <literal>-429496728</literal>. B��d ten
pojawia� si� tylko przy liczbach ujemnych i nie dotyczy� warto�ci
dodatnich.
</simpara>
<simpara>
Powy�szy problem zosta� rozwi�zany w PHP 4.1.0.
</simpara>
</warning>
</para>
<para>
W PHP nie ma operatora dzielenia ca�kowitego.
<literal>1/2</literal> daje wynik typu <type>float</type> o warto�ci
<literal>0.5</literal>.
<!-- See ??? for more information. (with the
operators, or with type-jug) -->
<informalexample>
<programlisting role="php">
<![CDATA[
var_dump( 25/7 );
// wynik: float(3.5714285714286)
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 id="language.types.integer.casting">
<title>Konwersja na liczby ca�kowite</title>
<simpara>
Do jawnej konwersji warto�ci na typ <type>integer</type> u�ywa si�
operatora rzutowania <literal>(int)</literal> lub
<literal>(integer)</literal>. W wi�kszo�ci przypadk�w jednak rzutowanie
nie jest potrzebne, gdy� warto�� zostanie skonwertowana automatycznie,
o ile operator, funkcja lub struktura kontrolna wymaga argumentu typu
<type>integer</type>.
</simpara>
<simpara>
Zobacz te�
<link linkend="language.types.type-juggling">wykorzystywanie
typ�w danych</link>.
</simpara>
<sect3 id="language.types.integer.casting.from-boolean">
<title>Z <link linkend="language.types.boolean"
>boolowskiej</link></title>
<simpara>
&false; b�dzie mie� warto��
<literal>0</literal> (zero), a &true;
b�dzie mie� warto�� <literal>1</literal> (jeden).
</simpara>
</sect3>
<sect3 id="language.types.integer.casting.from-float">
<title>Z <link linkend="language.types.float">liczb
zmiennoprzecinkowych</link></title>
<simpara>
Przy konwersji z liczb zmiennoprzecinkowych do ca�kowitych, liczba
zostanie zaokr�glona <emphasis>w d�</emphasis>.
</simpara>
<para>
Je�li liczba zmiennoprzecinkowa jest poza zakresem liczb ca�kowitych,
(zwykle <literal>+/- 2.15e+9 = 2^31</literal>), wynik operacji
rzutowania jest niezdefiniowany, poniewa� liczba zmiennoprzecinkowa nie
ma odpowiedniej precyzji, aby zwr�ci� dok�adn� liczb� ca�kowit�. W tej
sytuacji nie pojawi si� �adne ostrze�enie ani informacja odno�nie
powsta�ego b��du!
</para>
<warning><para>
Nigdy nie nale�y rzutowa� nieznanego u�amka do typu
<type>integer</type>, gdy� mo�e to doprowadzi� do otrzymania
nieprzewidywalnych wynik�w.
<informalexample>
<programlisting role="php">
<![CDATA[
echo (int) ( (0.1+0.7) * 10 ); // wy�wietla 7!
]]>
</programlisting>
</informalexample>
Wi�cej informacji na ten temat w rozdziale <link
linkend="warn.float-precision">precyzja liczb
zmiennoprzecinkowych</link>.
</para></warning>
</sect3>
<sect3 id="language.types.integer.casting.from-string">
<title>Z �a�cuch�w znak�w</title>
<simpara>
Zobacz <link linkend="language.types.string.conversion">konwersja
�a�cuch�w znak�w</link>
</simpara>
</sect3>
<sect3 id="language.types.integer.casting.from-other">
<title>Z innych typ�w</title>
<para>
<caution>
<simpara>
Wynik konwersji do liczb ca�kowitych z innych typ�w jest nieokre�lony.
Obecnie zachowanie jest takie samo, jakby zmienna zosta�a najpierw
<link linkend="language.types.boolean.casting">skonwertowana do
typu boolowskiego</link>. <emphasis>Nie</emphasis> nale�y jednak
polega� na tym zachowaniu, gdy� mo�e ono ulec zmianie bez �adnego
ostrze�enia.
</simpara>
</caution>
</para>
<!--
IMO, it would more sense as (int) $arr returned the
number of elements in $arr. This won't break anything,
since this behaviour was never defined before, and
(bool)(int) $arr will still behave the same.
-->
</sect3>
</sect2>
</sect1>
<sect1 id="language.types.float">
<title>Liczby zmiennoprzecinkowe (float)</title>
<para>
Liczby zmiennoprzecinkowe (typ float, double lub liczby rzeczywiste)
mog� by� zapisane przy u�yciu dowolnej z poni�szych sk�adni:
<synopsis>
$a = 1.234; $a = 1.2e3; $a = 7E-10;
</synopsis>
<!--
LNUM [0-9]+
DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
-->
Maksymalna wielko�� liczby zmiennoprzecinkowej jest zale�na od platformy
operacyjnej, zwykle jest to ~1.8e308, przy precyzji 14 liczb dziesi�tnych
po przecinku (jest to 64 bitowy format IEEE).
</para>
<warning id="warn.float-precision">
<title>Precyzja liczb zmiennoprzecinkowych</title>
<para>
Jest oczywiste, �e nawet proste u�amki dziesi�tne, takie jak
<literal>0.1</literal> lub <literal>0.7</literal>, nie mog� zosta�
skonwertowane na ich dw�jkowe odpowiedniki bez niewielkiej straty
dok�adno�ci. Mo�e to powodowa� pewne problemy: na przyk�ad wyra�enie
<literal>floor((0.1+0.7)*10)</literal> zwykle ma warto��
<literal>7</literal>, zamiast oczekiwanej <literal>8</literal>, gdy�
wewn�trzna reprezentacja tego warto�ci to liczba
<literal>7.9999999999...</literal>.
</para>
<para>
Powi�zane jest to z faktem, �e dla pewnych u�amk�w zwyk�ych nie istnieje
sko�czone rozwini�cie dziesi�tne. Na przyk�ad <literal>1/3</literal> w
reprezentacji dziesi�tnej ma warto�� <literal>0.3333333. . .</literal>.
</para>
<para>
Dlatego nigdy nie nale�y wierzy� liczbom zmiennoprzecinkowym do ostatniej
cyfry i nigdy nie nale�y wykonywa� operacji por�wnania na stwierdzenie
r�wno�ci. Do operacji na liczbach zmiennoprzecinkowych o naprawd� du�ej
precyzji nale�y u�y� <link
linkend="ref.bc">biblioteki BCMath</link> lub funkcji
<link linkend="ref.gmp">gmp</link>.
</para>
</warning>
</sect1>
<sect1 id="language.types.string">
<title>�a�cuchy znak�w (string)</title>
<para>
Typ <type>string</type> oznacza �a�cuch znak�w. W PHP znak jest tym sam co
bajt, co oznacza, �e jest mo�liwych 256 r�nych znak�w. Oznacza to tak�e,
�e PHP nie posiada �adnej wbudowanej obs�ugi Unikodu.
<!-- how about unicode? will we support that eventually? Are
there current any ways to work with unicode?
-->
</para>
<note>
<simpara>
Nie ma technicznych problem�w, kt�re utrudnia�yby tworzenie bardzo d�ugich
ci�g�w znak�w. Nie ma te� ustalonej maksymalnej d�ugo�ci �a�cuch�w znak�w
obs�ugiwanych w PHP, wi�c nie ma powodu do obaw, �e dany �a�cuch jest zbyt
d�ugi.
</simpara>
</note>
<sect2 id="language.types.string.syntax">
<title>Sk�adnia</title>
<para>
�a�cuch znak�w mo�na utworzy� na trzy sposoby.
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.single">pojedyncze
cudzys�owy</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.double">podw�jne
cudzys�owy</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.heredoc">sk�adnia
heredoc</link>
</simpara>
</listitem>
</itemizedlist>
</para>
<sect3 id="language.types.string.syntax.single">
<title>Pojedyncze cudzys�owy</title>
<para>
Najprostszym spos�bem na zdefiniowanie prostego �a�cucha znak�w, jest
umieszczenie go w pojedynczych cudzys�owach (znak <literal>'</literal>).
</para>
<para>
Aby w takim �a�cuch umie�ci� symbol pojedynczego cudzys�owu, nale�y go
poprzedzi� uko�nikiem wstecznym (<literal>\</literal>), tak jak w wielu
innych j�zykach programowania. Je�li uko�nik wsteczny ma wyst�pi� przed
symbolem pojedynczego cudzys�owu lub na ko�cu �a�cucha, wtedy nale�y
napisa� go dwukrotnie. W przypadku u�ycia uko�nika wstecznego z innym
znakiem, uko�nik te� zostanie wy�wietlony! Nie ma zatem potrzeby pisania
uko�nika dwukrotnie w innych sytuacjach.
<note>
<simpara>
W PHP 3, ostrze�enie na poziomie <literal>E_NOTICE</literal> zostanie
wy�wietlone, je�li zajdzie powy�sza sytuacja.
</simpara>
</note>
<note>
<simpara>
W przeciwie�stwie do dw�ch pozosta�ych sk�adni, zmienne
<emphasis>nie</emphasis> b�d� zamienione na swoje warto�ci, kiedy
pojawi� si� pomi�dzy pojedynczymi cudzys�owami.
</simpara>
</note>
<informalexample>
<programlisting role="php">
<![CDATA[
echo 'przyk�adowy tekst';
echo 'Wewn�trz �a�cuch�w znak�w mog� si� znajdowa� prze�amania linii,
o w�a�nie takie.';
echo 'Adam powiedzia�: "I\'ll be back"';
// wynik: ... "I'll be back"
echo 'Czy na pewno chcesz skasowa� C:\\*.*?';
// wynik: ... skasowa� C:\*.*?
echo 'Czy na pewno chcesz skasowa� C:\*.*?';
// wynik: ... skasowa� C:\*.*?
echo 'Pr�buj� w tym miejscu wprowadzi�: \n znak nowej linii';
// wynik: ... wprowadzi�: \n znak nowej linii
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 id="language.types.string.syntax.double">
<title>Podw�je cudzys�owy</title>
<para>
Kiedy �a�cuch znak�w jest umieszczony pomi�dzy podw�jnymi cudzys�owami,
PHP interpretuje wi�cej sekwencji cytowania dla znak�w specjalnych:
</para>
<table>
<title>Znaki cytowane (specjalne)</title>
<tgroup cols="2">
<thead>
<row>
<entry>sekwencja</entry>
<entry>znaczenie</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>\n</literal></entry>
<entry>nowa linia (LF lub 0x0A (10) w ASCII)</entry>
</row>
<row>
<entry><literal>\r</literal></entry>
<entry>powr�t karetki (CR lub 0x0D (13) w ASCII)</entry>
</row>
<row>
<entry><literal>\t</literal></entry>
<entry>tabulacja pozioma (HT lub 0x09 (9) w ASCII)</entry>
</row>
<row>
<entry><literal>\\</literal></entry>
<entry>odwrotny uko�nik</entry>
</row>
<row>
<entry><literal>\$</literal></entry>
<entry>znak dolara</entry>
</row>
<row>
<entry><literal>\"</literal></entry>
<entry>cudzys��w podw�jny</entry>
</row>
<row>
<entry><literal>\[0-7]{1,3}</literal></entry>
<entry>
sekwencja znak�w pasuj�ca do powy�szego wyra�enia regularnego daje
znak zapisany w notacji �semkowej
</entry>
</row>
<row>
<entry><literal>\x[0-9A-Fa-f]{1,2}</literal></entry>
<entry>
sekwencja znak�w pasuj�ca do powy�szego wyra�enia regularnego daje
znak zapisany w notacji szesnastkowej
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Tak jak w poprzedniej sk�adni, zapisanie uko�nika wstecznego przed
ka�dym innymi znakiem spowoduje wy�wietlenie zar�wno uko�nika, jak i
znaku.
</para>
<para>
Ale najwa�niejsz� w�a�ciwo�ci� podw�jnych cudzys�ow�w jest to, �e zapisane
w nich zmienne zostan� zamienione na ich warto�ci. Wi�cej informacji
w rozdziale <link linkend="language.types.string.parsing">parsowanie
�a�cuch�w znak�w</link>.
</para>
</sect3>
<sect3 id="language.types.string.syntax.heredoc">
<title>Sk�adnia Heredoc</title>
<simpara>
Jeszcze jednym sposobem na zapisanie �a�cucha znak�w jest u�ycie skladni
heredoc ("<<<"). Po operatorze <literal><<<</literal>
powinno si� umie�ci� identyfikator i takim samym identyfikatorem trzeba
zako�czy� �a�cuch znak�w.
</simpara>
<simpara>
Identyfikator zamykaj�cy <emphasis>musi</emphasis> zaczyna� si� w
pierwszej kolumnie nowej linii. Identyfikator musi te� podlega� regu�om
nazewnictwa w PHP: musi si� sk�ada� wy��cznie z alfanumerycznych znak�w
oraz znaku podkre�lenia i musi zaczyna� si� od litery lub znaku
podkre�lenia.
</simpara>
<warning>
<simpara>
Wa�ne by pami�ta�, �e linia zawieraj�ca identyfikator zamykaj�cy nie
mo�e zawiera� �adnych innych znak�w, z <emphasis>wyj�tkiem</emphasis>
�rednika (<literal>;</literal>). Znaczy to przede wszystkim, �e
identyfikator zamykaj�cy <emphasis>nie mo�e by� wcinany</emphasis>,
i nie mo�e by� �adnych spacji ani tabulacji przed lub za �rednikiem.
</simpara>
<simpara>
Najbardziej dokuczliwym ograniczeniem jest to, �e wewn�trz tego �a�cucha
znak�w nie mo�e by� znaku powrotu karetki (<literal>\r</literal>) na
ko�cu linii, jedynie znak nowej linii (<literal>\n</literal>).
Poniewa� Microsoft Windows u�ywa jako znaku ko�ca linii sekwencji
<literal>\r\n</literal>, �a�cuchy znak�w zapisne w sk�adni heredoc
mog� nie dzia�a�, je�li skrypt zostanie napisany w edytorze windowsowym.
Na szcz�cie wi�kszo�� edytor�w tekstowych udost�pnia mo�liwo�� zapisania
pliku w uniksowym formacie ko�ca linii.
<!--
FTP will sometimes automatically convert \r\n to \n while
transferring your files to your webserver (which
is *nix, of course)
-->
</simpara>
</warning>
<para>
Sk�adnia heredoc zachowuje si� podobnie jak tekst w cudzys�owach
podw�jnych. Oznacza to te�, ze nie ma potrzeby cytowania cudzys�ow�w w tej
sk�adni, ale nadal mo�na u�ywa� znak�w cytowanych, opisanych powy�ej.
W tej sk�adni nazwa zmiennej zamieniana jest na jej warto��, ale nale�y
zachowa� ostro�no�� przy zapisie z�o�onych zmiennych razem z tekstem.
<example>
<title>Przyk�ad sk�adni heredoc</title>
<programlisting role="php">
<![CDATA[
<?php
$str = <<<EOD
Przyk�ad �a�cucha znak�w,
zajmuj�cego kilka linii,
zapisanego w sk�adni heredoc.
Przyk�adowe zastosowanie w przezentacji liryki.
Litwo! Ojczyzno moja! ty jeste� jak zdrowie;
Ile ci� trzeba ceni�, ten tylko si� dowie,
Kto ci� straci�. Dzi� pi�kno�� tw� w ca�ej ozdobie
Widz� i opisuj�, bo t�skni� po tobie.
\tAdam Mickiewicz - Pan Tadeusz
EOD;
/* Bardziej z�o�ony przyk�ad, ze zmiennymi */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MojeImi�';
echo <<<EOT
Nazywam si� "$name". Wy�wietlam $foo->foo.
A teraz wy�wietlam z tablicy: {$foo->bar[1]}.
Po dwukropku powinien pojawi� si� znak 'A': \x41
EOT;
?>
]]>
</programlisting>
</example>
</para>
<note>
<para>
Obs�uga sk�adni heredoc zosta�a dodana w PHP 4.
</para>
</note>
</sect3>
<sect3 id="language.types.string.parsing">
<title>Parsowanie zmiennych</title>
<simpara>
Kiedy �a�cuch znak�w jest zapisany w cudzys�owach podw�jnych lub w sk�adni
heredoc, zawarte w nim nazwy zmiennych s� parsowane, tzn.
zamieniane na ich warto�ci.
</simpara>
<simpara>
S� dwa rodzaje sk�adni,
<link linkend="language.types.string.parsing.simple">prosta</link>
i
<link linkend="language.types.string.parsing.complex">z�o�ona</link>.
Sk�adnia prosta jest najbardziej popularna i najwygodniejsza, pozwala
na parsowanie zmiennej, warto�ci z tablicy oraz w�a�ciwo�ci obiektu.
</simpara>
<simpara>
Sk�adnia z�o�ona pojawi�a si� w PHP 4, i mo�na j� rozpozna� po nawiasach
sze�ciennych, otaczaj�cych wyra�enie.
</simpara>
<sect4 id="language.types.string.parsing.simple">
<title>Sk�adnia prosta</title>
<simpara>
Je�li wewn�trz zmiennej pojawi si� znak dolara (<literal>$</literal>),
parser pobierze, jak najwi�cej tylko si� da znak�w, aby utworzy� poprawn�
nazw� zmiennej. Aby jawnie okre�li� koniec nazwy zmiennej, nale�y j�
zapisa� w nawiasach sze�ciennych.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$beer = 'Heineken';
echo "$beer's taste is great"; /* dzia�a, "'" nie jest poprawnym znakiem nazwy
zmiennej*/
echo "He drunk some $beers"; /* nie dzia�a, 's' jest poprawnym znakiem nazwy
zmiennej*/
echo "He drunk some ${beer}s"; // dzia�
]]>
</programlisting>
</informalexample>
<simpara>
Podobnie dzia�a parsowanie elementu tablicy lub w�a�ciwo�ci obiektu.
Dla tablic, prawy nawias prostok�tny (<literal>]</literal>) oznacza
koniec indeksu. Dla w�a�ciwo�ci obiektu obowi�zuj� te same regu�y
jak dla zwyk�ych zmiennych, jednak nie dzia�aj� tu opisane powy�ej
sztuczki ze zmiennymi.
<!-- XXX isn't &true; :(, this would be the trick
Also,
the same trick with curly-braces works if you
want to limit the greediness of parsers (aren't they
paying them enough or something?).
-->
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$owoce = array( 'truskawka' => 'czerwona' , 'banan' => '��ty' );
// zauwa� �e to dzia�a inaczej poza cudzys�owami
echo "Banan jest $owoce[banan].";
echo "Kwadrat ma szeroko�� $kwadrat->szeroko�� metr�w.";
// Nie dzia�a. Trzeba tu zastosowa� sk�adni� z�o�on�
echo "Kwadrat ma szeroko�� $kwadrat->szeroko��00 centymetr�w.";
]]>
<!-- XXX this won't work:
echo "This square is $square->{width}00 centimeters broad.";
// XXX: php developers: it would be consequent to make this work.
// XXX: like the $obj->{expr} syntax outside a string works,
// XXX: analogously to the ${expr} syntax for variable var's.
-->
</programlisting>
</informalexample>
<simpara>
Do wyra�e� bardziej skomplikowanych nale�y u�ywa� sk�adni z�o�onej.
</simpara>
</sect4>
<sect4 id="language.types.string.parsing.complex">
<title>Sk�adnia z�o�ona</title>
<simpara>
Nazwa tej sk�adni nie pochodzi od skomplikowanego zapisu, tylko od
jej mo�liwo�ci obs�ugi z�o�onych wyra�e�.
</simpara>
<simpara>
Za pomoc� tej sk�adni mo�na umieszcza� w �a�cuchach znak�w ka�d� warto��
istniej�c� w przestrzeni nazw. Odpowiednie wyra�enie pisze si� tak, jakby
mia�o ono znajdowa� si� gdziekolwiek poza ���cuchem znak�w, a potem tylko
umieszcza si� je mi�dzy { i }. Poniewa� nie mo�na cytowa� "{", sk�adnia
ta b�dzie prawid�owo rozpoznana tylko wtedy, kiedy $ znajduje si�
bezpo�rednio za {. (U�yj "{\$" lub "\{$" aby uzyska� "{$"). Poni�ej kilka
przyk�ad�w:
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$fajne = 'fantastyczne';
echo "To jest { $fajne}"; // nie dzia�a, zwraca: To jest { fantastyczne}
echo "To jest {$fajne}"; // dzia�a, zwraca: To jest fantastyczne
echo "Kwadrat ma szeroko�� {$kwadrat->szeroko��}00 centimetr�w.";
echo "To dzia�a: {$arr[4][3]}";
// Tak jest �le z tego samego powodu
// co $foo[bar] poza �a�cuchem.
echo "Tak jest �le: {$arr[foo][3]}";
echo "Prawid�owo jest tak: {$arr['foo'][3]}";
echo "Mo�na nawet pisa� tak: {$obj->warto�ci[3]->nazwa}";
echo "To jest warto�� zmiennej o nazwie $nazwa: {${$nazwa}}";
]]>
<!-- maybe it's better to leave this out??
// this works, but i disencourage its use, since this is NOT
// involving functions, rather than mere variables, arrays and objects.
$beer = 'Heineken';
echo "I'd like to have another {${ strrev('reeb') }}, hips";
-->
</programlisting>
</informalexample>
</sect4>
</sect3>
<sect3 id="language.types.string.substr">
<title>Indeksowanie �a�cucha (ofsety)</title>
<para>
Dost�p do pojedynczego znaku �a�cucha jest mo�liwy po podaniu jego
indeksu (ofsetu) w nawiasach sze�ciennych, zaraz po nazwie zmiennej.
Pierwszy znak w �a�cuchu ma indeks zero.
</para>
<note>
<simpara>
Dla zachowania kompatybilno�ci wstecznej, nadal mo�na u�ywa� nawias�w
kwadratowych, jednak sk�adnia ta, w PHP 4, jest uznana za przestarza��.
</simpara>
</note>
<para>
<example>
<title>Przyk�ady u�ywania �a�cuch�w znak�w</title>
<programlisting role="php">
<!-- TODO: either move these examples to a example section,
as with arrays, or distribute them under the applicable
sections. -->
<![CDATA[
<?php
/* Przypisywanie �a�cucha do zmiennej */
$str = "To jest �a�cuch znak�w";
/* Do��czanie innego �a�cucha */
$str = $str . " a to jego dalsza cz��";
/* inny spos�b do��czania, ze znakiem nowej linii na ko�cu */
$str .= " wraz ze znakiem nowej linii na ko�cu.\n";
/* Ten �a�cuch b�dzie zawiera�: "<p>Liczba: 9</p>" */
$num = 9;
$str = "<p>Liczba: $num</p>";
/* Natomiast tutaj b�dzie: "<p>Liczba: $num</p>" */
$num = 9;
$str = '<p>Liczba: $num</p>';
/* Pobranie pierwszego znaku �a�cucha */
$str = 'To jest przyk�ad.';
$pierwszy = $str{0};
/* Ostatni znak �a�cucha */
$str = 'Dalsza cz�� przyk�adu.';
$ostatni = $str{strlen($str)-1};
?>
]]>
</programlisting>
</example>
</para>
</sect3>
</sect2><!-- end syntax -->
<sect2 id="language.types.string.useful-funcs">
<title>Przydatne funkcje i operatory</title><!-- and operators -->
<para>
�a�cuchy znak�w ��czy si� za pomoc� operatora '.' (kropka). Prosz�
pami�ta�, �e operator dodawania '+' nie obs�uguje ��czenia �a�cuch�w.
Wi�cej informacji w rozdziale
<link linkend="language.operators.string">operatory �a�cuchowe</link>.
</para>
<para>
PHP posiada mn�stwo funkcji operuj�cych na �a�cuchach znak�w.
</para>
<simpara>
Najwi�cej na ten temat w rozdziale
<link linkend="ref.strings">funkcje �a�cuchowe</link>. Poza tym obs�ugiwane
s� wyra�enia regularne dla potrzeb zaawnsowanych operacji znajd� i zamie�
(w dw�ch odmianach: <link linkend="ref.pcre">Perl</link> oraz
<link linkend="ref.regex">POSIX extended</link>).
</simpara>
<simpara>
S� tak�e <link linkend="ref.url">funkcje obs�ugi �a�cuch�w URL</link>,
jak r�wnie� funkcje szyfrowania i deszyfrowania �a�cuch�w
(<link linkend="ref.mcrypt">mcrypt</link> oraz
<link linkend="ref.mhash">mhash</link>).
</simpara>
<simpara>
Je�li nadal nie znalaz�e� tego, czego potrzebujesz, by� mo�e pomog�
ci <link linkend="ref.ctype">funkcje kontroli typu znak�w</link>.
</simpara>
</sect2>
<sect2 id="language.types.string.conversion">
<title>Konwersja �a�cuch�w znak�w</title>
<simpara>
Je�li �a�cuch znak�w jest konwertowany na posta� liczbow�, rezultat
konwersji b�dzie zale�a� od poni�szych czynnik�w.
</simpara>
<simpara>
�a�cuch zostanie skonwertowany do typu <type>float</type>, je�li zawiera
znaki ".", "e" lub "E". W przeciwnym razie zostanie skonwertowany do typu
<type>integer</type>.
</simpara>
<para>
Warto�� liczbowa �a�cucha znak�w zale�y od pierwszych znak�w tego
�a�cucha. Je�li �a�cuch zaczyna si� od poprawnej warto�ci liczbowej,
warto�� ta b�dzie u�ywa przy konwersji. W przeciwnym razie zwr�cona b�dzie
warto�� 0 (zero). Poprawna warto�� liczbowa zaczyna si� od opcjonalnego
znaku, po kt�rym znajduje si� jedna, lub kilka cyfr (opcjonalnie
zawieraj�ce przecinek dziesi�tny), po kt�rym opcjonalnie znajduje si�
eksponent. Eksponent jest to znak "e" lub "E", po kt�rym nast�puje jedna,
lub wi�cej cyfr.
</para>
<simpara>
Kiedy pierwszym wyra�eniem jest �a�cuch znak�w, typ zmiennej b�dzie zale�a�
od drugiego wyra�enia.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$foo = 1 + "10.5"; // $foo jest typu float (11.5)
$foo = 1 + "-1.3e3"; // $foo jest typu float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo jest typu integer (1)
$foo = 1 + "bob3"; // $foo jest typu integer (1)
$foo = 1 + "10 ma�ych �winek"; // $foo jest typu integer (11)
$foo = 1 + "10 malutkich �winek"; // $foo jest typu integer (11)
$foo = "10.0 �winek " + 1; // $foo jest typu integer (11)
$foo = "10.0 �winek " + 1.0; // $foo jest typu float (11)
]]>
</programlisting>
</informalexample>
<simpara>
Wi�cej informacji na temat tej konwersji znajduje si� w podr�czniku Uniksa,
na stronie polecenia strtod(3).
</simpara>
<para>
Je�li chcia�by� przetestowa� kt�ry� z przyk�ad�w w tym rozdziale, mo�esz
je skopiowa� i wklei�, a nast�pnie doda� poni�sz� lini� i obserwowa�
rezultaty.
<informalexample>
<programlisting role="php">
<![CDATA[
echo "\$foo==$foo; jest typu " . gettype ($foo) . "<br>\n";
]]>
</programlisting>
</informalexample>
</para>
</sect2>
</sect1><!-- end string -->
<sect1 id="language.types.array">
<title>Tablice (array)</title>
<para>
Tablica w PHP jest obecnie uporz�dkowan� map�. Mapa jest typem, kt�ry
przyporz�dkowuje <emphasis>warto�ci</emphasis> do
<emphasis>kluczy</emphasis>. Typ ten jest optymalizowany na wiele sposob�w,
wi�c mo�na go u�ywa� jako typow� tablic�, albo list� (wektorow�),
tablic� asocjacyjn� (kt�ra jest jedn� z implementacji mapy), s�ownik,
kolekcj�, stos, kolejk�, i temu podobne. Poniewa� warto�ci� tablicy mo�e
by� inna tablica PHP, mo�na tak�e �atwo symulowa� drzewa.
</para>
<para>
Wyjasnienie wspomnianych struktur wykracza poza problematyk� tego
podr�cznika,
aczkolwiek poni�ej uwzgl�dniono conajmniej jeden przyk�ad na ka�d� z nich.
G��biej zainteresowanych czytelnik�w odsy�amy do odpowiedniej literatury
informatycznej.
<!-- like goodrich&tamassia: datastructures and algorithmes.
Only, the subtitle is: in Java, and it's quite academic too -->
</para>
<sect2 id="language.types.array.syntax">
<title>Sk�adnia</title>
<sect3 id="language.types.array.syntax.array-func">
<title>Tworzenie za pomoc� <function>array</function></title>
<para>
Tablic� mo�na utworzy� za pomoc� konstrukcji j�zykowej
<function>array</function>. Argumentem tej konstrukcji s� rozdzielone
przecinkiem pary
<literal><replaceable>klucz</replaceable> => <replaceable
>warto��</replaceable></literal>.
</para>
<para>
<varname>klucz</varname> mo�e by� albo nieujemn� liczb� ca�kowit�,
<!--
Negative integers are also allowed, however, IMO it's best to not
document that, or even disencourage it.
Why?
First, because it is very tricky. But the real reason is that the key
'-1' will be interpreted as a string, and not as a integer. Therefore,
the usage
"the -1'st value of \$arr is $arr[-1]" is ambigious. By the way,
it results in a parse-error anyway, which is another argument for
not documenting it.
-Jeroen
-->
albo �a�cuchem znak�w.
Je�li klucz jest standardow� reprezentacj� nieujemnej liczby ca�kowitej,
zostanie zinterpretowany tak, jak jest (tzn. <literal>'8'</literal>
b�dzie zinterpretowane jako <literal>8</literal>, podczas gdy
<literal>'08'</literal> b�dzie zinterpretowane jako
<literal>'08'</literal>).
</para>
<para>
Warto�ci� mo�e by� cokolwiek.
</para>
<para>
Je�li pominiesz klucz, to jako klucz zostanie u�yty najwy�szy indeks
ca�kowity + 1. Je�li nie ma w og�le indeksu ca�kowitego, to klucz b�dzie
mia� warto�� <literal>0</literal> (zero). Je�li u�yjesz klucza, do kt�rego
ju� wcze�niej zosta�a przypisana warto��, warto�� ta zostanie nadpisana.
</para>
<para>
<synopsis>
array( <optional> <replaceable>klucz</replaceable> => </optional>
<replaceable>warto��</replaceable>
, ...
)
// <replaceable>klucz</replaceable> jest albo �a�cuchem znak�w, albo nieujemn�
liczb� ca�kowit�
// <replaceable>warto��</replaceable> mo�e by� dowolna
</synopsis>
</para>
</sect3>
<sect3 id="language.types.array.syntax.modifying">
<title>Tworzenie i edytowanie sk�adni� nawias�w kwadratowych</title>
<para>
Mo�na zmienia� istniej�c� tablic� jawnie ustawiaj�c warto�ci.
</para>
<para>
Robi si� to przez przypisanie warto�ci do tablicy z podaniem klucza w
nawiasach kwadratowych. Mo�na tak�e pomin�� klucz i u�y� pustej pary
nawias�w ("<literal>[]</literal>").
<synopsis>
$arr[<replaceable>klucz</replaceable>] = <replaceable>warto��</replaceable>;
$arr[] = <replaceable>warto��</replaceable>;
// <replaceable>klucz</replaceable> jest albo �a�cuchem znak�w, albo nieujemn�
liczb� ca�kowit�
// <replaceable>warto��</replaceable> mo�e by� dowolna
</synopsis>
Je�li tablica <varname>$arr</varname> nie istnieje, zostanie stworzona.
Jest to wi�c metoda na tworzenie tablic. Aby zmieni� warto�� konkretnego
klucza, po prostu przypisz now� warto�� do niego. Aby usun�� par�
klucz/warto��, trzeba u�y� funkcji <function>unset</function>.
</para>
</sect3>
</sect2><!-- end syntax -->
<sect2 id="language.types.array.useful-funcs">
<title>Przydatne funkcje</title>
<para>
Jest wiele przydatnych funkcji obs�ugi tablic, o czym wi�cej w rozdziale
<link linkend="ref.array">Tablice</link>.
</para>
<note>
<para>
Funkcja <function>unset</function> pozwala kasowa� kom�rki tablicy.
W takiej sytuacji jednak tablica NIE zostanie zreindeksowana.
<informalexample>
<programlisting role="php">
<![CDATA[
$a = array( 1 => 'jeden', 2 => 'dwa', 3 => 'trzy' );
unset( $a[2] );
/* to tak, jakby utworzy� tablic�:
$a = array( 1 => 'jeden', 3 => 'trzy');
ale NIE:
$a = array( 1 => 'jeden', 2 => 'trzy');
*/
]]>
</programlisting>
</informalexample>
</para>
</note>
<para>
Struktura kontrolna
<link linkend="control-structures.foreach">foreach</link> zosta�a stworzona
specjalnie dla potrzeb tablic. Dzi�ki niej mo�na �atwo trawersowa� tablic�.
</para>
</sect2>
<sect2 id="language.types.array.donts">
<title>Co wolno, a czego nie w tablicach?</title>
<sect3 id="language.types.array.foo-bar">
<title>Dlaczego zapis
<literal>$foo[bar]</literal> jest niepoprawny?</title>
<para>
W starych skryptach mo�na spotka� tak� sk�adni�:
<informalexample>
<programlisting role="php">
<![CDATA[
$foo[bar] = 'co�';
echo $foo[bar];
// itd.
]]>
</programlisting>
</informalexample>
Ten zapis jest niepoprawny, ale dzia�a. Dlaczego zatem jest niepoprawny?
Pow�d jest to, co opisano w rozdziale <link
linkend="language.types.array.syntax">sk�adnia</link>, �e pomi�dzy
nawiasami kwadratowymi ('<literal>[</literal>' i '<literal>]</literal>')
musi znajdowa� si� wyra�enie. Oznacza to, �e mo�na u�ywa� czego� takiego:
<informalexample>
<programlisting role="php">
<![CDATA[
echo $arr[ foo(true) ];
]]>
</programlisting>
</informalexample>
Jest to przyk�ad u�ycia warto�ci zwracanej przez funkcj� jako indeksu
tablicy. PHP zna te� sta�e, wi�c mo�na spotka� zastosowanie
<literal>E_*</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
$opis_b��du[E_ERROR] = "Wyst�pi� powa�ny b��d";
$opis_b��du[E_WARNING] = "PHP wys�a�o ostrze�enie";
$opis_b��du[E_NOTICE] = "To jest tylko nieformalna uwaga";
]]>
</programlisting>
</informalexample>
Prosz� pami�ta�, �e <literal>E_ERROR</literal> jest tak�e wa�nym
identyfikatorem, tak jak <literal>bar</literal> w pierwszym przyk�adzie.
Ale ostatni przyk�ad znaczy to samo co:
<informalexample>
<programlisting role="php">
<![CDATA[
$opis_b��du[1] = "Wyst�pi� powa�ny b��d";
$opis_b��du[2] = "PHP wys�a�o ostrze�enie";
$opis_b��du[8] = "To jest tylko nieformalna uwaga";
]]>
</programlisting>
</informalexample>
poniewa� <literal>E_ERROR</literal> znaczy to samo co
<literal>1</literal>, itd.
</para>
<para>
W takiem razie, jak to mo�liwe, �e <literal>$foo[bar]</literal> dzia�a?
To dzia�a, poniewa� <literal>bar</literal>, zgodnie z jego zapisem
powinien by� sta��. Jednak�e w tym przypadku nie instnieje sta�a o nazwie
<literal>bar</literal>. PHP teraz zak�ada, �e masz na my�li
<literal>bar</literal> literalnie, czyli jako �a�ucuch
<literal>"bar"</literal>, tylko �e zapomnia�e� napisa� cudzys�ow�w.
</para>
<sect4>
<title>Wi�c dlaczego tak jest �le?</title>
<para>
Kiedy� w przysz�o�ci grupa PHP mo�e chcie� doda� jeszcze jedn� sta�� lub
s�owo kluczowe i wtedy b�dziesz mia� k�opot. Dla przyk�adu, obecnie
ju� nie mo�na u�ywa� s��w <literal>empty</literal> i
<literal>default</literal>, gdy� s� to specjalne s�owa kluczowe.
<!-- <jeroen>hmm... i'm doubting this myself. Finish it if you like</jeroen>
But probably
the most threatening
thing is yourself, or whoever will maintain the script. You'll
maybe get very strange behaviour, and
-->
</para>
<para>
Poza tym, je�li dot�d argumenty nie przekonuj� ci�: ta sk�adnia jest
po prostu odrzucona i kiedy� mo�e przesta� dzia�a�.
</para>
<note>
<simpara>
Po prze��czeniu <link linkend="function.error-reporting"
>error_reporting</link> na <literal>E_ALL</literal>, zobaczysz, �e
PHP generuje ostrze�enie, kiedy tylko powy�sza sk�adnia zostanie
u�yta. Tak samo generowane b�d� ostrze�enia odno�nie innych odrzuconych
"udogodnie�". (umie�� w swoim skrypcie lini�
<literal>error_reporting(E_ALL);</literal>)
</simpara>
</note>
<note>
<simpara>
Sk�adnia ta jest dozwolona wewn�trz �a�cucha znak�w w podw�jnych
cudzys�owach. Wi�cej szczeg��w na ten temat w rozdziale
<link linkend="language.types.string.parsing"
>parsowanie zmiennych</link>.
</simpara>
</note>
</sect4>
</sect3>
</sect2>
<sect2 id="language.types.array.examples">
<title>Przyk�ady</title>
<para>
Typ tablicowy w PHP jest bardzo r�norodny, co prezentuj� poni�sze
przyk�ady.
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
// to:
$a = array( 'kolor' => 'czerowny'
, 'smak' => 's�odki'
, 'kszta�t' => 'okr�g�y'
, 'nazwa' => 'jab�ko'
, 4 // kluczem b�dzie 0
);
// znaczy dok�adnie to samo, co to:
$a['kolor'] = 'czerwony';
$a['smak'] = 's�odki';
$a['kszta�t'] = 'okr�g�y';
$a['nazwa'] = 'jab�ko';
$a[] = 4; // kluczem b�dzie 0
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// znaczy to samo co: array( 0 => 'a' , 1 => 'b' , 2 => 'c' ),
// albo pro�ciej: array('a', 'b', 'c')
]]>
</programlisting>
</informalexample>
</para>
<example>
<title>U�ycie array()</title>
<programlisting role="php">
<![CDATA[
// tablica jako mapa w�a�ciwo�ci
$mapa = array( 'version' => 4
, 'OS' => 'Linux'
, 'lang' => 'polski'
, 'short_tags' => true
);
// tylko klucze liczbowe
$array = array( 7
, 8
, 0
, 156
, -10
);
// znaczy to samo co array( 0 => 7, 1 => 8, ...)
$zmiany = array( 10 // klucz = 0
, 5 => 6
, 3 => 7
, 'a' => 4
, 11 // klucz = 6 (najwy�szy indeks ca�kowity by� 5)
, '8' => 2 // klucz = 8 (ca�kowity!)
, '02' => 77 // klucz = '02'
, 0 => 12 // warto�� 10 b�dzie nadpisana przez 12
);
// pusta tablica
$pusta = array();
]]>
<!-- TODO example of
- mixed keys
- overwriting keys
- integer keys as string
- using vars/functions as key/values
- mixed skipping
-->
</programlisting>
</example>
<example id="language.types.array.examples.loop">
<title>Kolekcja</title>
<programlisting role="php">
<![CDATA[
$kolory = array('czerwony','niebieski','zielony','��ty');
foreach ( $kolory as $kolor ) {
echo "Czy lubisz $kolor?\n";
}
/* wynik:
Czy lubisz czerwony?
Czy lubisz niebieski?
Czy lubisz zielony?
Czy lubisz ��ty?
*/
]]>
</programlisting>
</example>
<para>
Obecnie nie jest mo�liwa zmiana warto�ci w tabeli przy u�yciu takiej p�tli.
<!--
Should be made possible, if you write:
foreach ( $colors as &$color )
See bug#3074
-->
Mo�na to jednak rozwi�za� tak:
<example id="language.types.array.examples.changeloop">
<title>Collection</title>
<programlisting role="php">
<![CDATA[
foreach ($kolory as $klucz => $kolor) {
// nie dzia�a:
//$kolor = strtoupper($kolor);
// dzia�a:
$kolory[$klucz] = strtoupper($kolor);
}
print_r($kolory);
/* wynik:
Array
(
[0] => CZERWONY
[1] => NIEBIESKI
[2] => ZIELONY
[3] => �ӣTY
)
*/
]]>
</programlisting>
</example>
</para>
<para>
Poni�szy przyk�ad tworzy tablic� z pierwszym kluczem 1.
<example>
<title>Pierwszy klucz 1</title>
<programlisting role="php">
<![CDATA[
$kwarta� = array(1 => 'Stycze�', 'Luty', 'Marzec');
print_r($kwarta�);
/* wynik:
Array
(
[1] => 'Stycze�'
[2] => 'Luty'
[3] => 'Marzec'
)
*/
]]>
</programlisting>
</example>
</para>
<example>
<title>Wype�nianie prawdziwej tablicy</title>
<programlisting role="php">
<![CDATA[
// wype�nij tablic� zawarto�ci� folderu
$uchwyt = opendir('.');
while ($plik = readdir($uchwyt))
{
$pliki[] = $plik;
}
closedir($uchwyt);
]]>
</programlisting>
</example>
<para>
Dane w tablicach s� uporz�dkowane. Ich kolejno�� mo�e by� zmieniona za
pomoc� r�norodnych funkcji sortuj�cych. Wi�cej na ten temat w rozdziale
<link linkend="ref.array">tablice</link>.
</para>
<example>
<title>Sortowanie tablic</title>
<programlisting role="php">
<![CDATA[
sort($pliki);
print_r($pliki);
]]>
</programlisting>
</example>
<para>
Poniewa� warto�ci� tablicy mo�e by� wszystko, mo�e te� ni� by� inna
tablica. Mo�na w ten spos�b tworzy� tablice rekursywne i wielowymiarowe.
</para>
<example>
<title>Tablice rekursywne i wielowymiarowe</title>
<programlisting role="php">
<![CDATA[
$owoce = array ( "owoce" => array ( "a" => "pomara�cza"
, "b" => "banan"
, "c" => "jab�ko"
)
, "liczby" => array ( 1
, 2
, 3
, 4
, 5
, 6
)
, "dziury" => array ( "pierwsza"
, 5 => "druga"
, "trzecia"
)
);
]]>
<!-- quite duplicate...
$a = array(
"apple" => array(
"color" => "red",
"taste" => "sweet",
"shape" => "round"
),
"orange" => array(
"color" => "orange",
"taste" => "tart",
"shape" => "round"
),
"banana" => array(
"color" => "yellow",
"taste" => "paste-y",
"shape" => "banana-shaped"
)
);
-->
</programlisting>
</example>
</sect2>
<!-- TODO
<sect2>
<title>Misc</title>
</sect2>
- example multi-dim with $arr[bla][bla] syntax
- converting to array
- warning about references
- note that assigning is copy (usually...)
-->
<!-- there is no such thing as multi/singel dim arrays (at least in PHP4)
<sect2 id="language.types.array.single-dim">
<title>Single Dimension Arrays</title>
<para>
PHP supports both scalar and associative arrays. In fact, there
is no difference between the two. You can create an array using
the
<function>list</function>
Nope
or <function>array</function>
functions, or you can explicitly set each array element value.
<informalexample>
<programlisting role="php">
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
</programlisting>
</informalexample>
</para>
<para>
You can also create an array by simply adding values to the
array. When you assign a value to an array variable using empty
brackets, the value will be added onto the end of the array.
<informalexample>
<programlisting role="php">
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world"
</programlisting>
</informalexample>
</para>
<para>
Arrays may be sorted using the <function>asort</function>,
<function>arsort</function>, <function>ksort</function>,
<function>rsort</function>, <function>sort</function>,
<function>uasort</function>, <function>usort</function>, and
<function>uksort</function> functions depending on the type of
sort you want.
</para>
<para>
You can count the number of items in an array using the
<function>count</function> function.
</para>
<para>
You can traverse an array using <function>next</function> and
<function>prev</function> functions. Another common way to
traverse an array is to use the <function>each</function>
function.
</para>
</sect2>
<sect2 id="language.types.array.multi-dim">
<title>Multi-Dimensional Arrays</title>
<para>
Multi-dimensional arrays are actually pretty simple. For each
dimension of the array, you add another [key] value to the end:
<informalexample>
<programlisting role="php">
$a[1] = $f; # one dimensional examples
$a["foo"] = $f;
$a[1][0] = $f; # two dimensional
$a["foo"][2] = $f; # (you can mix numeric and associative indices)
$a[3]["bar"] = $f; # (you can mix numeric and associative indices)
$a["foo"][4]["bar"][0] = $f; # four dimensional!
</programlisting>
</informalexample>
</para>
<para>
In PHP 3 it is not possible to reference multidimensional arrays
directly within strings. For instance, the following will not
have the desired result:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "This won't work: $a[3][bar]";
</programlisting>
</informalexample>
In PHP 3, the above will output <computeroutput>This won't work:
Array[bar]</computeroutput>. The string concatenation operator,
however, can be used to overcome this:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "This will work: " . $a[3]['bar'];
</programlisting>
</informalexample>
</para>
<para>
In PHP 4, however, the whole problem may be circumvented by
enclosing the array reference (inside the string) in curly
braces:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "This will work: {$a[3][bar]}";
</programlisting>
</informalexample>
</para>
<para>
You can "fill up" multi-dimensional arrays in many ways, but the
trickiest one to understand is how to use the
<function>array</function> command for associative arrays. These
two snippets of code fill up the one-dimensional array in the
same way:
<informalexample>
<programlisting role="php">
# Example 1:
$a["color"] = "red";
$a["taste"] = "sweet";
$a["shape"] = "round";
$a["name"] = "apple";
$a[3] = 4;
# Example 2:
$a = array(
"color" => "red",
"taste" => "sweet",
"shape" => "round",
"name" => "apple",
3 => 4
);
</programlisting>
</informalexample>
</para>
<para>
The <function>array</function> function can be nested for
multi-dimensional arrays:
<informalexample>
<programlisting role="php">
<?php
$a = array(
"apple" => array(
"color" => "red",
"taste" => "sweet",
"shape" => "round"
),
"orange" => array(
"color" => "orange",
"taste" => "tart",
"shape" => "round"
),
"banana" => array(
"color" => "yellow",
"taste" => "paste-y",
"shape" => "banana-shaped"
)
);
echo $a["apple"]["taste"]; # will output "sweet"
?>
</programlisting>
</informalexample>
</para>
</sect2>
-->
</sect1>
<sect1 id="language.types.object">
<title>Obiekty (object)</title>
<sect2 id="language.types.object.init">
<title>Inicjowanie obiekt�w</title>
<para>
Aby zainicjowa� obiekt, nale�y u�y� s�owa kluczowego <literal>new</literal>
aby przypisa� instancj� obiektu do zmiennej.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Pe�na informacja na ten temat znajduje si� w rozdziale <link
linkend="language.oop">Klasy i Obiekty</link>.
</simpara>
</sect2>
</sect1>
<sect1 id="language.types.resource">
<title>Identyfikator zasob�w (resource)</title>
<para>
Identyfikator zasob�w jest specjaln� zmienn�, przechowywuj�c� odno�nik
do zewn�trznego �r�d�a zasob�w. Identyfikatory zasob�w s� tworzone
i wykorzystywane przez specjalne funkcje. Zobacz
<link linkend="resource">suplement</link> z list� tych funkcji i
powi�zanych z tym typ�w zasob�w.
</para>
<note>
<simpara>
Identyfikator zasob�w zosta� wprowadzony w PHP 4.
</simpara>
</note>
<sect2 id="language.types.resource.self-destruct">
<title>Zwalnianie zasob�w</title>
<para>
Dzi�ki systemowi kontroli zasob�w, wprowadzonemu w opracowanym przez Zend
silniku skryptowym PHP 4, automatycznie wykrywana jest sytuacja, kiedy
nie ma ju� odno�nik�w do zasobu (tak jak w Java). W takie sytuacji zasoby
systemowe u�ywane do tego zasobu zostaj� zwolnione przez destruktor
zasob�w. Dlatego nie jest
konieczne, aby zwalnia� pami�� r�cznie za pomoc� funkcji typu free_result.
<note>
<simpara>
Wyj�tkiem s� tu sta�e po��czenia z serwerami baz danych, kt�re
<emphasis>nie</emphasis> s�
niszczone przez destruktor zasob�w. Zobacz te� <link
linkend="features.persistent-connections">sta�e po��czenia</link>.
</simpara>
</note>
</para>
</sect2>
</sect1>
<sect1 id="language.types.null">
<title>Typ NULL (null)</title>
<para>
Specjalna warto�� &null; oznacza, �e zmienna nie przechowuje �adnej
warto�ci. &null; jest jedyn� mo�liw� warto�ci� typu <type>NULL</type>.
</para>
<note>
<simpara>
Typ <type>NULL</type> zosta� wprowadzony w PHP 4.
</simpara>
</note>
<sect2 id="language.types.null.syntax">
<title>Sk�adnia</title>
<para>
Jest tylko jedna warto��, jak� mo�e mie� typ &null; i jest ni� s�owo
kluczowe &null;. Wielko�� liter s�owa &null; nie gra roli.
<informalexample>
<programlisting role="php">
$var = NULL;
</programlisting>
</informalexample>
</para>
</sect2>
</sect1>
<sect1 id="language.types.type-juggling">
<title>Wykorzystywanie typ�w danych</title>
<simpara>
PHP nie wymaga (a nawet nie obs�uguje) jawnej deklaracji typ�w zmiennych.
Typ zmiennej jest okre�lany na podstawie kontekstu, w jakim ta zmienna jest
u�ywana. Oznacza to m.in., �e przy przypisaniu �a�cucha znak�w do zmiennej
<parameter>var</parameter>, zmienna ta zmienia sw�j typ na string. Je�li
potem zostanie przypisana warto�� ca�kowita, <parameter>var</parameter>
zmienia sw�j typ na integer.
</simpara>
<para>
Przyk�adem automatyczniej konwersji typ�w jest operator dodawania '+'.
Je�li kt�rykolwiek z operand�w jest typu float, to wszystkie operandy
zostan� potraktowane jako liczby float i taki te� typ b�dzie zwr�cony jako
wynik dodawania. W przeciwnym razie operandy zostan� potraktowane jako
liczby ca�kowite i wynikiem tak�e b�dzie liczba ca�kowita. Prosz� jednak
zwr�ci� uwag�, �e dzia�anie to NIE zmienia typ�w samych operand�w; zmienia
jedynie spos�b ich interpretacji przez operator dodawania.
<informalexample>
<programlisting role="php">
$foo = "0"; // $foo jest �a�cuchem znak�w (ASCII 48)
<!-- bad example, no real operator (must be used with variable, modifies it too)
$foo++; // $foo is the string "1" (ASCII 49)
-->
$foo += 2; // $foo jest liczb� ca�kowit� (2)
$foo = $foo + 1.3; // $foo jest liczb� zmiennoprzecinkow� (3.3)
$foo = 5 + "10 Ma�ych �winek"; // $foo jest liczb� ca�kowit� (15)
$foo = 5 + "10 Wi�kszych �winek"; // $foo jest liczb� ca�kowit� (15)
<!--
TODO: explain ++/- - behaviour with strings
examples:
++'001' = '002'
++'abc' = 'abd'
++'xyz' = 'xza'
++'9.9' = '9.0'
++'-3' = '-4'
- -'9' = 8 (integer!)
- -'5.5' = '5.5'
- -'-9' = -10 (integer)
- -'09' = 8 (integer)
- -'abc' = 'abc'
-->
</programlisting>
</informalexample>
</para>
<simpara>
Je�li dwa ostanie przyk�ady wydaj� si� tobie dziwne, zajrzyj do rozdzia�u
<link linkend="language.types.string.conversion">Konwersja �a�cuch�w
znak�w</link>.
</simpara>
<simpara>
Je�li chcesz skonwertowa� zmienn� z jednego typu do innego, u�yj
<link linkend="language.types.typecasting">rzutowania typ�w</link>. Aby
zmieni� typ zmiennej, u�yj <function>settype</function>.
</simpara>
<para>
Je�li chcesz przetestowa� kt�rykolwiek z przyk�ad�w z tego rozdzia�u, mo�esz
u�y� funkcji <function>var_dump</function>.
</para>
<note>
<para>
Efekty automatycznej konwersji do tablicy s� aktualnie nieokre�lone.
<informalexample>
<programlisting role="php">
$a = 1; // $a jest liczb� ca�kowit�
$a[0] = "f"; // $a staje si� tablic�, $a[0] zawiera "f"
</programlisting>
</informalexample>
</para>
<para>
W powy�szym przyk�adzie wydawa� si� mo�e oczywiste, �e $a stanie si�
tablic� z pierwszym elementem "f"; rozwa� jednak poni�szy przyk�ad:
<informalexample>
<programlisting role="php">
$a = "1"; // $a jest �a�cuchem znak�w
$a[0] = "f"; // Co z ofsetami �a�cuch�w? Co si� dzieje?
</programlisting>
</informalexample>
</para>
<para>
Poniewa� PHP obs�uguje indeksowanie �a�cuch�w za pomoc� ofset�w, u�ywaj�c
tej samej sk�adni co indeksowanie tablic, powy�szy przyk�ad powoduje
problem: czy $a powinno zosta� tablic� z pierwszym elementem o warto�ci
"f", czy raczej "f" powinno zosta� pierwszym znakiem �a�cucha $a?
</para>
<para>
Z tego w�a�nie powodu, od PHP 3.0.12 i PHP 4.0b3-RC4, efekt automatycznej
konwersji pozostaje nieokre�lony. Dyskusje odno�nie tego problemu trwaj�.
</para>
</note>
<sect2 id="language.types.typecasting">
<title>Rzutowanie typ�w</title>
<para>
Rzutowanie typ�w w PHP dzia�a mniej wi�cej tak jak w j�zyku C: nazwa
docelowego typu umieszczana jest w nawiasach przed nazw� zmiennej, kt�ra
ma by� zrzutowana.
<informalexample>
<programlisting role="php">
$foo = 10; // $foo jest liczb� ca�kowit�
$bar = (float) $foo; // $bar jest typu float (zmiennoprzecinkowego)
</programlisting>
</informalexample>
</para>
<para>
Operatory rzutowania s� nast�puj�ce:
<itemizedlist>
<listitem>
<simpara>(int), (integer) - rzutowanie do liczb ca�kowitych</simpara>
</listitem>
<listitem>
<simpara>(bool), (boolean) - rzutowanie do typu boolowskiego</simpara>
</listitem>
<listitem>
<simpara>(float), (double), (real) - rzutowanie do liczb
zmiennoprzecinkowych</simpara>
</listitem>
<listitem>
<simpara>(string) - rzutowanie do �a�cucha znak�w</simpara>
</listitem>
<listitem>
<simpara>(array) - rzutowanie do tablicy</simpara>
</listitem>
<listitem>
<simpara>(object) - rzutowanie do obiektu</simpara>
</listitem>
</itemizedlist>
</para>
<note>
<simpara>
Zamiast rzutowa� zmienn� do �a�cucha znak�w operatorem, mo�na te� umie�ci�
zmienn� w cudzys�owie podw�jnym.
<!-- TODO: example -->
</simpara>
</note>
<para>
Wewn�trz nawias�w operatora rzutowania mog� znajdowa� si� tabulacje i
spacje, wi�c poni�sze przyk�ady s� funkcjonalnie identyczne:
<informalexample>
<programlisting role="php">
$foo = (int) $bar;
$foo = ( int ) $bar;
</programlisting>
</informalexample>
</para>
<para>
Efekt rzutowania pomi�dzy niekt�rymi typami nie zawsze daje spodziewany
wynik. Wi�cej informacji o skutkach rzutowania w rozdzia�ach:
<itemizedlist>
<listitem>
<simpara><link linkend="language.types.boolean.casting">Konwersja
do typu boolowskiego</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.integer.casting">Konwersja do
liczb ca�kowitych</link></simpara>
</listitem>
<!-- don't exist yet
<listitem>
<simpara><link linkend="language.types.float.casting">Converting to
float</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.string.casting">Converting to
string</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.array.casting">Converting to
array</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.object.casting">Converting to
object</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.resource.casting">Converting to
resource</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.null.casting">Converting to
&null;</link></simpara>
</listitem>
-->
</itemizedlist>
</para>
<para>
<!-- TODO: move to 'converting to string' -->
Przy rzutowaniu lub wymuszeniu konwersji z tablicy do �a�cucha znak�w,
rezultatem b�dzie s�owo <literal>Array</literal>. Przy rzutowaniu lub
wymuszeniu konwersji z obiektu do �a�cucha znak�w, rezultatem b�dzie
s�owo <literal>Object</literal>.
<!-- not with my PHP, not even a notice... maybe in PHP3?
Does someone know?
In both cases a warning will
be issued. -->
</para>
<para>
Przy rzutowaniu ze zmiennej skalarnej lub �a�cucha do tablicy, warto��
zmiennej stanie si� pierwszym elementem tablicy:
<informalexample>
<programlisting role="php">
$var = 'ciao';
$arr = (array) $var;
echo $arr[0]; // wynik: 'ciao'
</programlisting>
</informalexample>
</para>
<para>
Przy rzutowaniu ze zmiennej skalarnej lub �a�cucha do obiektu, warto��
zmiennej stanie si� w�a�ciwo�ci� obiektu; w�a�ciwo�� ta b�dzie nazywa�
si� 'scalar':
<informalexample>
<programlisting role="php">
$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar; // wynik: 'ciao'
</programlisting>
</informalexample>
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->