luk             Wed Feb 27 19:04:05 2002 EDT

  Added files:                 
    /phpdoc/cs/appendices       commandline.xml debugger.xml history.xml 
                                migration.xml 
  Log:
  
  
  

Index: phpdoc/cs/appendices/commandline.xml
+++ phpdoc/cs/appendices/commandline.xml
<?xml version="1.0" encoding="iso-8859-2"?>

<!-- 
   TODO:
   
     The command line options not in the
     list, but in the -h output below:
   
       -e, -z
    
     It would be best to document these, and
     collect more info about -c and -d!
-->
<appendix id="commandline">
 <title>Použití PHP z příkazové řádky</title>
 <para>
  Možnosti PHP při spouštění z příkazové řádky přinášejí mnoho užitku,
  pokud chcete ladit nebo testovat vaše nastavení PHP, hodí se však
  i pro případy, kdy byste rádi použili PHP pro jiné účely než WWW
  skriptování.  
 </para>
 <para>
  Uvědomte si, že můžete vždy směrovat výstup programu PHP do vnějšího
  souboru pomocí znaku &gt;, takže <literal>php -q test.php >
  test.html</literal> vytiskne výstup <filename>test.php</filename>
  bez HTTP hlaviček do <filename>test.html</filename> ve stejném adresáři.  
 </para>
 <para>
  Možnosti příkazové řádky můžete využívat pouze tehdy, máte-li (spustitelný)
  program PHP. Pokud jste zkompilovali pouze modul do serveru a nemáte na
  počítači žádnou CGI verzi, nemůžete příkazovou řádku používat.
  Pro uživatele Windows je v binárním balíčku jak serverový modul, tak
  spustitelný soubor nazvaný <filename>php.exe</filename>.
 </para>
 <para>
  Tento seznem voleb pro příkazovou řádku je konzistentní s PHP 4.0.6.
  Aktuální seznam včetně jednořádkových popisů můžete získat pomocí parametru
  <literal>-h</literal>. Výstup <literal>php -h</literal> by měl vypadat
  přibližně takto:  
  <screen>
<![CDATA[
Usage: php [-q] [-h] [-s [-v] [-i] [-f <file>] |  {<file> [args...]}
  -q             Quiet-mode.  Suppress HTTP Header output.
  -s             Display colour syntax highlighted source.
  -f <file>      Parse <file>.  Implies `-q'
  -v             Version number
  -C             Do not chdir to the script's directory
  -c <path>      Look for php.ini file in this directory
  -d foo[=bar]   Define INI entry foo with value 'bar'
  -e             Generate extended information for debugger/profiler
  -z <file>      Load Zend extension <file>.
  -l             Syntax check only (lint)
  -m             Show compiled in modules
  -i             PHP information
  -h             This help
]]>
  </screen>
 </para>
 <para>
  Zde uvádíme některé z nejdůležitějších voleb s detailním vysvětlením.  
 </para>
 <para>
  <table>
   <title>Volby pro příkazovou řádku</title>
   <tgroup cols="2">
    <thead>
     <row>
      <entry>Volba</entry>
      <entry>Popis</entry>
     </row>
    </thead>
    <tbody>
     <row>
      <entry>-q</entry>
      <entry>
       Potlačí výstup HTTP hlaviček. Normálně PHP tiskne HTTP hlavičky
       pro volající program (typicky WWW server) k předání prohlížeči.
       Při použití pro aplikace spouštěné z příkazové řádky nemají hlavičky
       smysl.
      </entry>
     </row>
     <row>
      <entry>-s</entry>
      <entry>
       Zobrazí barevně vysvícený zdrojový soubor s daným názvem.
       Je to totéž, jako když se zdroj vytiskne pomocí funkce
       <function>highlight_file</function> v PHP skriptu.
      </entry>
     </row>
     <row>
      <entry>-f</entry>
      <entry>
       Parsuje daný soubor a hledá syntaktické a fatální chyby.
       Tato volba implikuje -q. Použijte pro ladicí účely
       (debugging).       
      </entry>
     </row>
     <row>
      <entry>-v</entry>
      <entry>
       Zavoláním PHP s tímto přepínačem si můžete vypsat číslo verze,
       např. 4.0.6.        
      </entry>
     </row>
     <row>
      <entry>-C</entry>
      <entry>
       Za normálních okolností PHP mění pracovní adresář na ten, kde se
       nachází spouštěný skript. To například umožňuje otvírat soubory
       ve stejném adresáři určením pouhého názvu souboru (bez cesty).
       Pokud byste toto chtěli potlačit, použijte tuto volbu.       
      </entry>
     </row>
     <row>
      <entry>-c</entry>
      <entry>
       Použitím tohoto argumentu můžete specifikovat alternativní
       umístění souboru <filename>php.ini</filename>, takže PHP bude
       hledat konfigurační soubor zde namísto implicitního umístění.       
      </entry>
     </row>
     <row>
      <entry>-d</entry>
      <entry>
       Touto volbou můžete provést individuální nastavení        
       <filename>php.ini</filename> během provádění skriptu.
      </entry>
     </row>
     <row>
      <entry>-l</entry>
      <entry>
       Otestuje daný soubor na syntaktické chyby. Tato volba implikuje
       -q. Použijte ji pro účely ladění. Nebudou se hledat fatální chyby
       (jako jsou nedefinované funkce). Pokud chcete hledat i fatální
       chyby, použijte -f.       
      </entry>
     </row>
     <row>
      <entry>-m</entry>
      <entry>
       Použitím této volby PHP vypíše zabudované (a načtené) PHP a Zend
       moduly, čísla verzí PHP a Zend, a také krátkou informaci o
       autorských právech k jádru Zend.       
      </entry>
     </row>
     <row>
      <entry>-i</entry>
      <entry>
       Tento přepínač zavolá funkci <function>phpinfo</function> a vypíše
       její výsledek. Pokud PHP nepracuje správně, je dobré spustit
       <literal>php -i</literal> a podívat se, zda se nevypsala nějaká
       chybová hlášení před nebo uvnitř informačních tabulek.
      </entry>
     </row>
     <row>
      <entry>-h</entry>
      <entry>
       Touto volbou získáte informace o aktuálních volbách příkazové řádky
       a jednořádkové popisy o tom, co dělají.       
      </entry>
     </row>
    </tbody>
   </tgroup>
  </table>
 </para>
 <para>
  Spustitelná verze PHP může být použita pro spouštění skriptů absolutně
  nezávisle na webovském serveru. Pokud jste na unixovém systému, můžete
  do PHP skriptu přidat speciální první řádek a udělat z něj spustitelný
  program - systém bude vědět, jaký program by měl skript zpracovávat.
  Na Windows můžete asociovat <literal>php.exe -q</literal> se souborovou
  příponou <literal>.php</literal> (pro spouštění dvojklikem), nebo můžete
  vytvořit dávkový soubor pro spuštění skriptu přes PHP. První řádek skriptu
  pro práci v Unixu nebude ve Windows vadit, takže tímto způsobem můžete
  psát programy pro více platforem. Jednoduchý příklad psaní PHP programu
  pro příkazovou řádku je uveden níže.    
 </para>
 <example>
  <title>Skript určený ke spouštění z příkazové řádky (script.php)</title>
  <programlisting role="php">
<![CDATA[
#!/usr/bin/php -q
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

This is a command line PHP script with one option.

  Usage:
  <?php echo $argv[0]; ?> <option>

  <option> can be some word you would like
  to print out. With the --help, -help, -h,
  or -? options, you can get this help.

<?php
} else {
    echo $argv[1];
}
?>
]]>
  </programlisting>
 </example>
 <para>
  Ve výše uvedeném skriptu jsme použili speciální první řádek k indikaci,
  že by tento soubor měl být spouštěn pomocí PHP a neměl by vypisovat
  HTTP hlavičky. Jsou zde dvě proměnné, které můžete použít při psaní
  aplikací pro PHP spouštěných z příkazové řádky:
  <varname>$argc</varname> a
  <varname>$argv</varname>. První z nich je počet argumentů + 1 (název
  běžícího skriptu). Druhá je pole obsahující argumenty, počínaje názvem
  skriptu jako číslo 0 (<varname>$argv[0]</varname>).
 </para>
 <para>
  V ukázkovém programu se testuje, zda je argumentů více či méně než jeden.
  Pokud by argument byl <literal>--help</literal>,
  <literal>-help</literal>, <literal>-h</literal> nebo <literal>-?</literal>,
  vytiskne se nápověda k programu včetně skutečného názvu skriptu.
  Pokud by byly přidány nějaké další argumenty, vytisknou se na výstup.  
 </para>
 <para>
  Pokud byste chtěli spouštět uvedený skript pod Unixem, musíte ho udělat
  spustitelným (nastavit práva pro spouštění), a pak jednoduše napsat
  <literal>script.php vypis_tohle</literal> nebo
  <literal>script.php -h</literal>. Na Windows musíte pro tento úkol vytvořit
  dávkový soubor:  
 </para>
 <example>
  <title>Dávkový soubor pro spouštění PHP skriptu z příkazové řádky 
(script.bat)</title>
  <programlisting role="winbat">
@c:\php\php.exe -q script.php %1 %2 %3 %4
  </programlisting>
 </example>
 <para>
  Za předpokladu, že jste výše uvedený program nazvali
  <filename>script.php</filename> a soubor
  <filename>php.exe</filename> máte uložený jako
  <filename>c:\php\php.exe</filename>, můžete tento dávkový soubor spouštět
  takto:  
  <literal>script.bat echothis</literal> nebo
  <literal>script.bat -h</literal>.
 </para>
 <para>
  Viz také dokumentaci rozšíření <link linkend="ref.readline">Readline</link>,
  kde najdete více funkcí pro použití k aplikacím PHP spouštěných z
  příkazové řádky.  
 </para>
</appendix>

<!-- 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:
-->

Index: phpdoc/cs/appendices/debugger.xml
+++ phpdoc/cs/appendices/debugger.xml
<?xml version="1.0" encoding="iso-8859-2"?>

 <appendix id="debugger">
  <title>Ladění (debugging) PHP</title>

  <sect1 id="debugger-about">
   <title>O debuggeru</title>
   <simpara>
    PHP 3 obsahuje pro podporu pro síťově založený debugger.
   </simpara>
   <simpara>
    PHP 4 nemá vnitřní mechanismy pro ladění. Nicméně můžete používat
    některý z externích debuggerů.    
    <ulink url="&url.zend.ide;">Zend IDE</ulink> obsahuje debugger, a
    ladicí rozšíření (jako DBG) najdete také na
    <ulink url="&url.dbg;">&url.dbg;</ulink> nebo na 
    <ulink url="&url.apd;">Advanced PHP Debugger</ulink> (APD).
   </simpara>
  </sect1>

  <sect1 id="debugger-using">
   <title>Použití debuggeru</title>

   <para>
    Vnitřní debugger v PHP 3 je užitečný pro hledání záludných chyb.
    Debugger pracuje prostřednictvím připojení na    
    <acronym>TCP</acronym> port při každém startu PHP 3.
    Všechny chybové zprávy z příslušné relace jsou posílány do tohoto TCP
    kanálu. Tyto informace jsou určeny pro "debugging server", který může
    běžet uvnitř <acronym>IDE</acronym> nebo programovatelného editoru
    (jako je Emacs).
   </para>
   <para>
    Jak nastavit debugger:
    <orderedlist>
     <listitem>
      <simpara> 
       Nastavte TCP port pro debugger v <link
       linkend="configuration.file">konfiguračním souboru</link> (<link
       linkend="ini.debugger.port">debugger.port</link>) a aktivujte ho
       (<link linkend="ini.debugger.enabled">debugger.enabled</link>).
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Nastavte TCP pro poslech na nějakém portu (například       
       <command>socket -l -s 1400</command> v UNIXu).
      </simpara>
     </listitem>
     <listitem>
      <simpara> 
       Ve vašem kódu spusťte       
       "debugger_on(<replaceable>host</replaceable>)", kde
       <replaceable>host</replaceable> je IP adresa nebo doménový název
       počítače, kde běží příslušný <acronym>TCP</acronym> server.
      </simpara>
     </listitem>
    </orderedlist>
    Nyní budou všechna varování, informativní zprávy apod. mířit na síťový
    socket, <emphasis>a to i tehdy, pokud je vypnete pomocí nastavení
    <function>error_reporting</function></emphasis>.  
   </para>
  </sect1>

  <sect1 id="debugger-protocol">
   <title>Protokol debuggeru</title>
   <para>
    Protokol PHP 3 debuggeru je řádkově orientovaný. Každý řádek je určitého    
    <emphasis>typu</emphasis> a několik řádků tvoří
    <emphasis>zprávu</emphasis>. Každá zpráva začíná řádkem typu
    <literal>start</literal> a končí řádkem typu
    <literal>end</literal>. PHP 3 může současně posílat řádky pro různé zprávy.
   </para>
   <para>
    Řádek má tento formát:
    <informalexample>
     <literallayout>
<replaceable>date</replaceable> <replaceable>time</replaceable>
<replaceable>host</replaceable>(<replaceable>pid</replaceable>)
<replaceable>type</replaceable>:
<replaceable>message-data</replaceable>
     </literallayout>
    </informalexample>
    <variablelist>
     <varlistentry>
      <term><replaceable>date</replaceable></term>
      <listitem>
       <simpara>
        Datum ve formátu ISO 8601
        
(<replaceable>yyyy</replaceable>-<replaceable>mm</replaceable>-<replaceable>dd</replaceable>)
       </simpara>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>time</replaceable></term>
      <listitem>
       <simpara>Čas včetně mikrosekund:
        
<replaceable>hh</replaceable>:<replaceable>mm</replaceable>:<replaceable>uuuuuu</replaceable>
       </simpara>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>host</replaceable></term>
      <listitem>
       <simpara>
        DNS (doménový) název nebo IP adresa počítače, kde byla vygenerována
        chyba ve skriptu.
       </simpara>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>pid</replaceable></term>
      <listitem>
       <simpara>
        PID (process id) na počítači <replaceable>host</replaceable> procesu,
        který vygeneroval chybu v PHP 3 skriptu.        
       </simpara>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>type</replaceable></term>
      <listitem>
       <para>
        Typ řádku. Říká přijímajícímu programu, jak má s následujícími
        daty naložit:   
        <table>
         <title>Typy řádků debuggeru</title>
         <tgroup cols="2">
          <thead>
           <row>
            <entry>Název</entry>
            <entry>Význam</entry>
           </row>
          </thead>
          <tbody>
           <row>
            <entry><literal>start</literal></entry> 
            <entry>
             Říká přijímajícímu programu, že tady začíná zpráva debuggeru.
             Obsahem datové části (<replaceable>data</replaceable>)bude typ
             chybové zprávy z níže uvedeného seznamu.        
            </entry>
           </row>
           <row>
            <entry><literal>message</literal></entry>
            <entry>Chybová zpráva PHP 3.</entry>
           </row>
           <row>
            <entry><literal>location</literal></entry>
            <entry>
             Název souboru a číslo řádku, kde nastala chyba. První řádek
             <literal>location</literal> bude vždy obsahovat nejvyšší úroveň
             umístění. <replaceable>data</replaceable> bude obsahovat
             
<literal><replaceable>file</replaceable>:<replaceable>line</replaceable></literal>.
             Řádek <literal>location</literal> bude následovat za každým
             řádkem <literal>message</literal> a každým řádkem
             <literal>function</literal>.
            </entry>
           </row>
           <row>
            <entry>
             <literal>frames</literal></entry>
             <entry>Počet rámců v následujícím výpisu zásobníku. Pokud jsou
             zde čtyři rámce, očekávejte informace o čtyřech úrovních
             volaných funkcí. Pokud se žádný řádek "frames" nevyskytuje,
             předpokládá se hloubka 0 (chyba nastala na nejvyšší úrovni).
            </entry>
           </row>
           <row>
            <entry>
             <literal>function</literal></entry> 
            <entry>
             Název funkce, kde nastala chyba. Bude se opakovat pro každou
             úroveň zásobníku volání funkcí.         
            </entry>
           </row>
           <row>
            <entry><literal>end</literal></entry> 
            <entry>
             Říká přijímajícímu programu, že tady končí zpráva debuggeru.            
            </entry>
           </row>
          </tbody>
         </tgroup>
        </table>
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable>data</replaceable></term>
      <listitem>
       <simpara>Data v řádku.</simpara>
      </listitem>
     </varlistentry>
    </variablelist>

    <table>
     <title>Typy chyb rozlišované debuggerem</title>
     <tgroup cols="2">
      <thead>
       <row>
        <entry>Debugger</entry>
        <entry>PHP 3 Internal</entry>
       </row>
      </thead>
      <tbody>
       <row>
        <entry><errortype>warning</errortype></entry>
        <entry><errortype>E_WARNING</errortype></entry>
       </row>
       <row>
        <entry><errortype>error</errortype></entry>
        <entry><errortype>E_ERROR</errortype></entry>
       </row>
       <row>
        <entry><errortype>parse</errortype></entry>
        <entry><errortype>E_PARSE</errortype></entry>
       </row>
       <row>
        <entry><errortype>notice</errortype></entry>
        <entry><errortype>E_NOTICE</errortype></entry>
       </row>
       <row>
        <entry><errortype>core-error</errortype></entry>
        <entry><errortype>E_CORE_ERROR</errortype></entry>
       </row>
       <row>
        <entry><errortype>core-warning</errortype></entry>
        <entry><errortype>E_CORE_WARNING</errortype></entry>
       </row>
       <row>
        <entry><errortype>unknown</errortype></entry>
        <entry>(všechny ostatní)</entry>
       </row>
      </tbody>
     </tgroup>
    </table>
    
    <example>
     <title>Příklad - zpráva debuggeru</title>
     <literallayout>
1998-04-05 23:27:400966 lucifer.guardian.no(20481) start: notice
1998-04-05 23:27:400966 lucifer.guardian.no(20481) message: Uninitialized variable
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: (&null;):7
1998-04-05 23:27:400966 lucifer.guardian.no(20481) frames: 1
1998-04-05 23:27:400966 lucifer.guardian.no(20481) function: display
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: 
/home/ssb/public_html/test.php3:10
1998-04-05 23:27:400966 lucifer.guardian.no(20481) end: notice
     </literallayout>
    </example>
   </para>
  </sect1>

 </appendix>

<!-- 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:
-->

Index: phpdoc/cs/appendices/history.xml
+++ phpdoc/cs/appendices/history.xml
<?xml version="1.0" encoding="iso-8859-2"?>

<appendix id="history">
 <title>Historie PHP a souvisejících projektů</title>
 <para>
  PHP urazilo v posledních několika málo letech dlouhou cestu.
  Růst v jeden z nejprominentnějších jazyků ovládajích Web nebyl snadný.
  Ti z vás, kdo máte zájem dozvědět se ve zkratce, jak PHP vyrostlo do
  dnešní podoby, čtěte dále.  
 </para>
 
 <sect1 id="history.php">
  <title>Historie PHP</title>
  
  <sect2 id="history.phpfi">
   <title>PHP/FI</title>
   <para>
    PHP je nástupcem staršího produktu, nazvaného PHP/FI. PHP/FI vytvořil
    Rasmus Lerdorf v roce 1995, na počátku jako jednoduchou sadu skriptů
    v jazyce Perl pro zpracování záznamů o přístupech k jeho webu. Tuto
    sadu nazval 'Personal Home Page Tools'. Protože byla třeba větší
    funkčnost, napsal Rasmus mnohem rozsáhlejší implementaci v C, která
    byla schopna komunikovat s databázemi aumožňovala uživatelům vyvíjet
    jednoduché dynamické aplikace pro Web. Rasmus se rozhodl uvolnit
    zdrojový kód PHP/FI pro všechny, takže kdokoli ho může používat, stejně
    jako opravovat chyby a vylepšovat kód.
   </para>
   <para>
    PHP/FI, což znamená Personal Home Page / Forms Interpreter, obsahovalo
    něco ze základní funkcionality PHP, jak ho známe dnes. Mělo proměnné
    perlovského typu, automatickou interpretaci formulářových proměnných
    a syntaxi vloženou do HTML. Syntaxe samotná byla podobná jazyku Perl,
    přestože mnohem omezenější, jednodušší a v něčem nekonzistentní.
   </para>
   <para>
    V roce 1997 se PHP/FI 2.0, druhá implementace psaná v C, stala kultovní
    záležitostí pro (odhadem) tisíce uživatelů po celém světě, a s přibližně
    50.000 doménami oznamujícími nainstalované PHP/FI, což čítalo zhruba
    1 % všech domén na Internetu. I když do projektu začalo svými kusy kódu
    přispívat více lidí, stále to byl velký projekt jednoho muže.   
   </para>
   <para>
    PHP/FI 2.0 bylo oficiálně uvolněno až v listopadu 1997, poté co strávilo
    většinu svého života v betaverzích. Krátce nato bylo následováno první
    alfaverzí PHP 3.0.    
   </para>
  </sect2>

  <sect2 id="history.php3">
   <title>PHP 3</title>
   <para>
    PHP 3.0 byla první verze, která se velmi blížila takovému PHP, jak ho
    známe dnes. Vytvořili ho Andi Gutmans a Zeev Suraski v roce 1997
    jako kompletně přepsaný celek, poté co shledali PHP/FI 2.0 výrazně
    "poddimenzované" pro vývoj svých aplikací pro e-komerci. Ve snaze
    spolupracovat a zahájit budování nad existující uživatelskou základnou
    PHP/FI, rozhodli se Andi, Rasmus a Zeev pracovat společně a prohlásit
    PHP 3.0 za oficiálního nástupce PHP/FI 2.0, a vývoj PHP/FI 2.0 byl
    v podstatě zastaven.
   </para>
   <para>
    Jednou z nejsilnějších zbraní PHP 3.0 byly jeho obrovské možnosti
    rozšíření. K poskytnutí pevné infrastruktury pro mnoho různých databází,
    protokolů a API koncovým uživatelům, přilákaly možnosti rozšíření PHP 3.0
    také tucty vývojářů, kteří se připojili a vytvořili nové rozšiřující
    moduly. Toto byl nesporně klíč k obrovskému úspěchu PHP 3.0. Jiným
    klíčovým prvkem v PHP 3.0 byla podpora objektově orientované syntaxe
    a mnohem silnější a konzistentnější syntaxe jazyka.
   </para>
   <para>
    Nový jazyk byl uvolněn pod novým názvem, který odstranil implikaci
    omezeného osobního použití, kterou neslo označení PHP/FI 2.0.
    Byl nazván pouze 'PHP', což je rekurzívní akronym
    - PHP: Hypertext Preprocessor.
   </para>
   <para>
    Na konci roku 1998 vyrostlo PHP do rozsahu instalací v řádu (odhadem)
    desítek tisíc uživatelů a stovek tisíc Webů. V době svého vrcholu bylo
    PHP 3.0 instalováno na přibližně 10 % všech WWW serverů na Internetu.    
   </para>
   <para>
    PHP 3.0 bylo oficiálně uvolněno v červnu 1998, poté co strávilo cca
    9 měsíců ve veřejném testování.    
   </para>
  </sect2>

  <sect2 id="history.php4">
   <title>PHP 4</title>
   <para>
    V zimě 1998, krátce po oficiálním uvolnění PHP 3.0, začali Andi Gutmans
    a Zeev Suraski pracovat na přespání jádra PHP. Cílem návrhu bylo
    zvýšit výkon pro složité aplikace a zlepšit modularitu kódové báze PHP.
    Takové aplikace byly schopny pracovat s PHP 3.0 (díky novým možnostem a
    podpoře široké škály databází a API od jiných tvůrců), ale PHP 3.0
    nebylo navrženo pro efektivní práci tak náročných aplikací.
   </para>
   <para>
    Nový engine, nazvaný 'Zend Engine' (sestaven z jejich křestních jmen,
    Zeev a Andi), úspěšně splnil cíle návrhu a byl uveden v polovině roku
    1999. PHP 4.0, založené na tomto enginu a doplněné širokou škálou nových
    prvků, bylo oficiálně uvolněno v květnu 2000, necelé dva roky po svém
    předchůdci, PHP 3.0. K podstatně zvýšenému výkonu této verze, přidává
    PHP 4.0 další klíčové prvky, jako je podpora pro mnoho WWW serverů,
    HTTP sessions, buffering výstupu, bezpečnější způsoby zpracování vstupů
    uživatele a mnoho nových jazykových konstruktů.
   </para>
   <para>
    PHP 4 je momentálně poslední uvolněnou verzí PHP. Již byla započata
    práce na modifikaci a vylepšení jádra Zend Engine k integraci prvků,
    které byly navrženy pro PHP 5.0.    
   </para>
   <para>
    Dnes používají PHP (odhadem) stovky tisíc vývojářů a nainstalované PHP
    hlásí několik milionů serverů - tj. přes 20 % domén na Internetu.    
   </para>
   <para>
    Vývojový tým PHP zahrnuje tucty vývojářů, stejně tak jako tucty dalších
    lidí, kteří pracují na projektech spojených s PHP, jako je PEAR a
    dokumentační projekt.
   </para>
  </sect2>
 </sect1>
 
 <sect1 id="history.php.related">
  <title>Historie projektů souvisejících s PHP</title>
  
  <!-- Hope Stig and/or Egon can do this
  
  <sect2 id="history.phpdoc">
   <title>PHP Documentation Project</title>
   <para>
   </para>
  </sect2>
  
  -->

  <sect2 id="history.pear">
   <title>PEAR</title>
   <para>
    PEAR, PHP Extension and Application Repository (česky repozitář
    rozšíření a aplokací PHP) - původně PHP Extension and Add-on Repository
    (repozitář rozšíření a doplňků) - je PHP verze "foundation classes",
    a může v budoucnu vyrůst v jeden z klíčových způsobů distribuce jak
    PHP rozšíření, tak rozšíření PHP psaných v C, mezi vývojáře.    
   </para>
   <para>
    PEAR se zrodil v diskusi na mítinku PHP Developers' Meeting (PDM)
    v lednu 2000 v Tel Avivu. Byl vytvořen Stigem S. Bakkenem a delegován
    na jeho prvorozenou dceru Malin Bakken.
   </para>
   <para>
    Od začátku roku 2000 PEAR vyrostl ve velký, významný projekt s velkým
    počtem vývojářů pracujících na společné, široce použitelné funkcionalitě
    ve prospěch celé PHP komunity. PEAR dnes zahrnuje širokou paletu
    infrastrukturních "foundation classes" pro přístup k databázím, cachování
    obsahu e-komerci a mnoho dalšího.    
   </para>
  </sect2>

  <sect2 id="history.phpqa">
   <title>PHP Quality Assurance Initiative</title>
   <para>
    PHP Quality Assurance Initiative (iniciativa zajištění kvality PHP)
    byla ustavena v létě 2000 v rakci na kritiku, že uvolněné verze PHP
    nebyly dostatečně testovány pro produkční prostředí. Tým nyní sestává
    z pevné skupiny vývojářů, kteří dobře rozumějí kódové bázi PHP. Tito
    vývojáři tráví mnoho času lokalizací a odstraňováním chyb v PHP. Navíc
    je zde mnoho členů týmu, kteří to pak testují a poskytují zpětnou vazbu
    na tyto opravy na široké škále platforem.
   </para>
  </sect2>

  <sect2 id="history.phpgtk">
   <title>PHP-GTK</title>
   <para>
    PHP-GTK je PHP řešení pro psaní GUI aplikací pro stranu klienta. Andrei
    Zmievski připomíná plánování a proces tvorby PHP-GTK:
   </para>
   <blockquote>
    <para>
     Programování GUI vždy patřilo mezi mé zájmy a shledal jsem Gtk+
     velmi příjemným toolkitem, kromě toho, že programovat s jeho použitím
     v C je někdy nudné. Po zkušenostech s PyGtk a GTK-Perl implemetacemi
     jsem se rozhodl podívat se, zda by se dalo v PHP vytvořit, alespoň
     trochu, rozhraní ke Gtk+. Počínaje srpnem 2000 jsem měl o něco více
     volného času, takže jsem začal experimentovat. Mým hlavním vodítkem
     byla implementace PyGtk, což bylo skutečně funkčně kompletní a příjemné
     objektově orientované rozhraní. James Henstridge, autor PyGtk,
     mi poskytl velmi užitečné rady během počatečního stádia vývoje.
    </para>
    <para>
     Ruční psaní rozhraní ke všem funkcím Gtk+ bylo zcela mimo hru,
     takže jsem se zabýval ideou generátoru kódu, podobného jako v případě
     PyGtk. Generátor kódu je program v PHP, který čte sadu .defs souborů
     obsahujících informace o třídách, konstantách a metodách Gtk+ a
     generuje kód v C, který pro ně poskytuje rozhraní. Co nelze vygenerovat
     automaticky, může být napsáno ručně v souboru .overrides.     
    </para>
    <para>
     Práce na generátoru kódu a na infrastruktuře trvala nějakou dobu,
     protože jsem na podzim 2000 mohl práci na PHP-GTK věnovat jen málo
     času. Když jsem to pak ukázal Franku Kromannovi, byl zaujat a začal mi
     pomáhat s prací na generátoru kódu a implementaci pro Win32. Když
     jsme napsali první program "Ahoj světe!" a spustili ho, bylo to
     extrémně vzrušující. Trvalo to několik měsíců, než se projekt dostal
     do prezentovatelného stavu a úvodní verze byla uvolněna 1 .března 2001.
     Příběh okamžitě zasáhl SlashDot.
    </para>
    <para>
     S ohledem na to, jak může být projekt PHP-GTK rozsáhlý, založil jsem
     pro něj samostatné diskusní skupiny a CVS repozitáře, stejně jako
     (s pomocí Colina Viebrocka) webovskou stránku gtk.php.net. Také by bylo
     třeba udělat dokumentaci a James Moore přispěchal pomoci s ní.
    </para>
    <para>
     Uvolněná verze PHP-GTK si již získala popularitu. Máme vlastní
     dokumentační tým, manuál se stále zlepšuje, lidé začínají psát
     rozšíření pro PHP-GTK, a víc a víc vzrušujících aplikací.
    </para>
   </blockquote>
  </sect2>
 </sect1>

 <sect1 id="history.php.books">
  <title>Knihy o PHP</title>
  <para>
   Jak PHP rostlo, začalo být považováno za celosvětově populární vývojovou
   platformu. Jedním z nejzajímavějších způsobů pozorování tohoto trendu
   je sledování knih o PHP vydávaných během posledních let.
  </para>
  <para>
   Pokud si dobře pamatujeme, první kniha zaměřená na PHP
   'PHP - Dynamische Webauftritte professionell realisieren' - německá
   kniha publikovaná v roce 1999, autory byli Egon Schmid,
   Christian Cartus and Richard Blume. První kniha v angličtině byla vydána
   krátce nato: 'Core PHP Programming' od Leona Atkinsona. Obě tyto knihy
   se zabývaly PHP 3.0.
  </para>
  <para>
   Tyto dvě knihy byly první svého druhu - a byly následovány velkým
   množstvím knih různých autorů a vydavatelů. Existuje přes 40 knih
   v angličtině, 50 knih v němčině a přes 20 knih ve francouzštině.
   Navíc můžete najít knihy o PHP v mnoha dalších jazycích včetně
   španělštiny, korejštiny, japonštiny a hebrejštiny.
  </para>
  <para>
   Samozřejmě, tento velký počet knih, psaných různými autory, vydávaných
   mnoha vydavateli a jejich dostupnost v tolika jazycích - je potvrzením
   celosvětového úspěchu PHP.
  </para>
 </sect1>
 
 <sect1 id="history.php.publications">
  <title>Ostatní publikace o PHP</title>
  <para>
   Podle našich nejlepších informací byl první článek o PHP v tištěném
   časopisu publikován ve French Informatiques Magazine na konci roku 1998
   a zabýval se PHP 3.0. Stejně jako v případě knih byl první v dlouhé řadě
   článků publikovaných v různých uznávaných časopisech.
  </para>
  <para>
   Články o PHP se objevily v časopisech Dr. Dobbs, Linux Enterprise,
   Linux Magazine a mnoha dalších. Články o přechod z aplikací založených na
   ASP na platformu PHP pod Windows se objevily dokonce na ryze Microsoftím
   MSDN!
  </para>
 </sect1>

</appendix>

<!-- 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:
-->

Index: phpdoc/cs/appendices/migration.xml
+++ phpdoc/cs/appendices/migration.xml
<?xml version="1.0" encoding="iso-8859-2"?>

<appendix id="migration">
 <title>Přechod z PHP/FI 2 na PHP 3</title>

 <section id="migration.about">
  <title>O nekompatibilitách v 3.0</title>

  <simpara>
   PHP 3.0 je od základu přepsáno. Má náležitý parser, který je mnohem
   robustnější a konzistentnější než ten ve verzi 2.0. Verze 3.0 je
   také signifikantně rychlejší a používá méně paměti. Logicky,
   některá z těchto vylepšení nebyla možná bez změnách v kompatibilitě,
   jak v syntaxi, tak ve funkcionalitě.
  </simpara>

  <simpara>
   Navíc se vývojáři PHP snažili vyčistit jak syntaxi, tak sémantiku
   PHP, což také přineslo nějaké nekompatibility. Ze širšího pohledu,
   věříme že tyto změny jsou pro dobro věci.   
  </simpara>

  <simpara>
   Tato kapitola se pokusí provést vás nekompatibilitami, na které můžete
   narazit při přechodu z PHP/FI 2.0 na PHP 3.0 a pomoci vám je vyřešit.
   Nové prvky zde nebudou zmiňovány, pokud to nebude nutné.
  </simpara>

  <simpara>
   Konverzní program, který automaticky převede vaše staré skripty v
   PHP/FI 2.0, existuje. Najdete ho adresáři
   <filename class="directory">convertor</filename> v distribuci PHP 3.0.
   Tento program však zachycuje pouze změny syntaxe, takže přesto pozorně
   čtěte tuto kapitolu.
  </simpara>
 </section>

 <section id="migration.startendtags">
  <title>Otvírací/uzavírací značky (start/end tags)</title>

  <para>
   Pravděpodobně první věcí, kterou zaznamenáte, je, že se změnily otevírací
   a uzavírací značky (označují začátek a konec kódu PHP). Staré značky
   <literal>&lt;? &gt;</literal> byly nahrazeny třemi možnými formami:   
   <example>
    <title>Přechod: staré otvírací/uzavírací značky</title>
    <programlisting role="php">
<![CDATA[
<? echo "This is PHP/FI 2.0 code.\n"; >
]]>
    </programlisting>
   </example>
   Jako verze 2.0, PHP 3.0 podporuje také tuto variantu:
   <example>
    <title>Přechod: první otvírací/uzavírací značky</title>
    <programlisting role="php">
<![CDATA[
<? echo "This is PHP 3.0 code!\n"; ?>
]]>
    </programlisting>
   </example>

   Všimněte si, že uzavírací značka nyní sestává z otazníku a znaku
   "větší než" namísto pouhého znaku "větší než". Bohužel, pokud na svém
   serveru plánujete používat XML, bude tato varianta dělat problémy,
   protože se PHP může pokoušet interpretovat XML značku jako PHP kód.
   Z tohoto důvodu byla zavedena nová varianta:   

   <example>
    <title>Přechod: druhé otvírací/uzavírací značky</title>
    <programlisting role="php">
<![CDATA[
<?php echo "This is PHP 3.0 code!\n"; ?>
]]>
    </programlisting>
   </example>

   Někteří lidé mají problémy s editory, které zcela neporozumí zpracování
   instrukčních značek. Jedním z takových editorů je Microsoft FrontPage,
   a jako řešení tohoto problému byla přidána ještě další varianta:   

   <example>
    <title>Přechod: třetí otvírací/uzavírací značky</title>
    <programlisting role="php">
<![CDATA[
<script language="php">

  echo "This is PHP 3.0 code!\n";

</script>
]]>
    </programlisting>
   </example>
  </para>
 </section>

 <section id="migration.if-endif">
  <title>syntaxe if..endif</title>

  <para>
   Alternativní způsob, jak zapsat konstrukci if/elseif/else, za použití
   if(); elseif(); else; endif;, nemůže být efektivně implementována bez
   podstatného nárůstu složitosti 3.0 parseru. Kvůli tomu se změnila syntaxe:   
   <example>
    <title>Přechod: stará syntaxe if..endif</title>
    <programlisting role="php">
<![CDATA[
if ($foo);
    echo "yep\n";
elseif ($bar);
    echo "almost\n";
else;
    echo "nope\n";
endif;
]]>
    </programlisting>
   </example>
   <example>
    <title>Přechod: nová syntaxe if..endif</title>
    <programlisting role="php">
<![CDATA[
if ($foo):
    echo "yep\n";
elseif ($bar):
    echo "almost\n";
else:
    echo "nope\n";
endif;
]]>
    </programlisting>
   </example>

   Všimněte si, že středníky byly nahrazeny dvojtečkami ve všech konstruktech
   kromě závěrečného (endif).
  </para>
 </section>

 <section id="migration-while">
  <title>syntaxe while</title>
  <para>
   Stejně jako if..endif, syntaxe while..endwhile byla změněna:
   <example>
    <title>Přechod: stará syntaxe while..endwhile</title>
    <programlisting role="php">
<![CDATA[
while ($more_to_come);
    ...
endwhile;
]]>
    </programlisting>
   </example>
   <example>
    <title>Přechod: nová syntaxe while..endwhile</title>
    <programlisting role="php">
<![CDATA[
while ($more_to_come):
    ...
endwhile;
]]>
    </programlisting>
   </example>
  </para>
  <warning>
   <simpara>
    Pokud v PHP 3.0 použijete starou syntaxi while..endwhile, získáte
    nekonečnou smyčku.
   </simpara>
  </warning>
 </section>

 <section id="migration.expr">
  <title>Typy výrazů</title>
  <simpara>
   PHP/FI 2.0 používalo levou stranu výrazů k určení, jakého typu má
   výsledek být. PHP 3.0 bere pro určení typu v úvahu obě strany výrazu,
   a to může způsobit nepředvídatelné chování 2.0 skriptů v PHP 3.0.   
  </simpara>
  <para>
   Uvažujme tento příklad:
   <informalexample>
    <programlisting role="php">
<![CDATA[
$a[0]=5;
$a[1]=7;

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}
]]>
    </programlisting>
   </informalexample>

   V PHP/FI 2.0 by to zobrazilo obě hodnoty v $a. V PHP 3.0 se však
   nezobrazí nic. Důvod je ten, že PHP 2.0 kvůli tomu, že na levé straně
   je řetezec, provede porovnání řetězců, a <literal>""</literal>
   se nerovná <literal>"0"</literal>, tedy se bude procházet cyklem.
   V PHP 3.0 se řetězec porovná s celým číslem (integer), provede se
   porovnání celých čísel (řetězec je převeden na celé číslo). Výsledkem
   je porovnání <literal>atoi("")</literal>, což je <literal>0</literal>, a
   <literal>variablelist</literal>, což je také <literal>0</literal>.
   A protože <literal>0==0</literal>, cyklem se vůbec procházet nebude.
  </para>
  <para>
   Oprava pro tento příklad je snadná. Nahraďte původní konstrukci tímto:
   <informalexample>
    <programlisting role="php">
<![CDATA[
while ((string)$key != "") {
]]>
    </programlisting>
   </informalexample>
  </para>
 </section>

 <section id="migration.errors">
  <title>Chybové zprávy se změnily</title>
  <simpara>
   Chybové zprávy PHP 3.0 jsou obvykle přesnější, než byly ve 2.0.
   Neuvidíte však část kódu, kde nastala chyba. Vypíše se pouze název
   souboru a číslo řádku, kde nastala chyba.
  </simpara>
 </section>

 <section id="migration.booleval">
  <title>Zkrácené vyhodnocení logických výrazů</title>
  <simpara>
   V PHP 3.0 se používá zkrácené vyhodnocení logických výrazů. To znamená,
   že pro výraz jako <literal>(1 || test_me())</literal> již nebude funkce
   <function>test_me</function> volána, protože za <literal>1</literal> již
   nic nemůže ovlivnit hodnotu výrazu.
  </simpara>

  <simpara>
   Toto je malá změna kompatibility,ale může způsobit neočekávané vedlejší
   efekty.
  </simpara>
 </section>

 <section id="migration.truefalse">
  <title>Návratové hodnoty &true;/&false;</title>
  <simpara>
   Většina vnitřních funkcí byla přepsána tak, aby vracela &true;
   v případě úspěchu a &false; při selhání, narozdíl od původních hodnot
   0 a -1 v PHP/FI 2.0. Nové chování umožňuje logičtější programování, jako
   <literal>$fp = fopen("/your/file") nebo fail("darn!");</literal>.
   Protože v PHP/FI 2.0 nebyla jasná pravidla, v kterých případech se
   vyskakovalo z funkce při selhání, většina skriptů bude pravděpodobně muset
   být zkontrolována ručně po použití konvertoru z 2.0 na 3.0.
  </simpara>
  <para>
   <example>
    <title>Přechod z 2.0: návratové hodnoty, starý kód</title>
    <programlisting role="php">
<![CDATA[
$fp = fopen($file, "r");
if ($fp == -1);
    echo("Could not open $file for reading<br>\n");
endif;
]]>
    </programlisting>
   </example>
   <example>
    <title>Přechod z 2.0: návratové hodnoty, nový kód</title>
    <programlisting role="php">
<![CDATA[
$fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n");
]]>
    </programlisting>
   </example>
  </para>
 </section>

 <section id="migration-other">
  <title>Jiné nekompatibility</title>

  <itemizedlist>
   <listitem><simpara>
    Modul PHP 3.0 pro Apache již nepodporuje verze Apache starší než 1.2.
    Je třeba Apache 1.2 nebo pozdější.
   </simpara></listitem>

   <listitem><simpara>
    Funkce <function>echo</function> již nepodporuje formátovaný řetězec.
    Použijte namísto toho <function>printf</function>.
   </simpara></listitem>

   <listitem><simpara>
    V PHP/FI 2.0 způsobovaly vedlejší efekty implementace to, že
    <literal>$foo[0]</literal> mělo stejný účinek jako
    <literal>$foo</literal>. Toto již v PHP 3.0 neplatí
   </simpara></listitem>

   <listitem>
    <simpara>
     Čtení z polí pomocí <literal>$array[]</literal> již není podporováno.
    </simpara>
    <simpara>
     To znamená, že nemůžete traverzovat pole v cyklu, který provádí
     <literal>$data = $array[]</literal>.  Použijte funkce
     <function>current</function> a <function>next</function>.
    </simpara>
    <simpara>
     Současně  <literal>$array1[] = $array2</literal> nepřipojuje hodnoty pole
     <literal>$array2</literal> k poli
     <literal>$array1</literal>, nýbrž připojuje pole
     <literal>$array2</literal> jako poslední položku pole
     <literal>$array1</literal>. Viz též: podpora vícerozměrných polí.
    </simpara>
   </listitem>

   <listitem>
    <simpara>
     <literal>"+"</literal> již není přetěžován jako spojovací operátor pro
     řetězce, namísto toho konvertuje řetězce na čísla a provede jejich
     (numerický) součet. Použijte tedy operátor
     <literal>"."</literal> instead.
    </simpara>
   </listitem>
  </itemizedlist>

  <example>
   <title>Přechod z 2.0: spojení řetězců</title>
   <programlisting role="php">
<![CDATA[
echo "1" + "1";
]]>
   </programlisting>
   <para>
    V PHP 2.0 by se vypsalo 11, v PHP 3.0 se vypíše 2.
    Když místo toho použijete:
    <programlisting role="php">
<![CDATA[
echo "1"."1";
]]>
    </programlisting>
    <programlisting role="php">
<![CDATA[
$a = 1;
$b = 1;
echo $a + $b;
]]>
    </programlisting>
   </para>
   <para>
    vypíše se 2 v PHP 2.0 i 3.0.
    <programlisting role="php">
<![CDATA[
$a = 1;
$b = 1;
echo $a.$b;
]]>
    </programlisting>
    Toto v PHP 3.0 vypíše 11.
   </para>
  </example>
 </section>

</appendix>

<!-- 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:
-->

Reply via email to