File: migration.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (379 lines) | stat: -rw-r--r-- 10,780 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
<?xml version="1.0" encoding="iso-8859-2"?>
<!-- EN-Revision: 1.18 Maintainer: luk Status: ready -->

<appendix id="migration">
 <title>Pechod z PHP/FI 2 na PHP 3</title>

 <section id="migration.about">
  <title>O nekompatibilitch v 3.0</title>

  <simpara>
   PHP 3.0 je od zkladu pepsno. M nleit parser, kter je mnohem
   robustnj a konzistentnj ne ten ve verzi 2.0. Verze 3.0 je
   tak signifikantn rychlej a pouv mn pamti. Logicky,
   nkter z tchto vylepen nebyla mon bez zmnch v kompatibilit,
   jak v syntaxi, tak ve funkcionalit.
  </simpara>

  <simpara>
   Navc se vvoji PHP snaili vyistit jak syntaxi, tak smantiku
   PHP, co tak pineslo njak nekompatibility. Ze irho pohledu,
   vme e tyto zmny jsou pro dobro vci.   
  </simpara>

  <simpara>
   Tato kapitola se pokus provst vs nekompatibilitami, na kter mete
   narazit pi pechodu z PHP/FI 2.0 na PHP 3.0 a pomoci vm je vyeit.
   Nov prvky zde nebudou zmiovny, pokud to nebude nutn.
  </simpara>

  <simpara>
   Konverzn program, kter automaticky pevede vae star skripty v
   PHP/FI 2.0, existuje. Najdete ho adresi
   <filename class="directory">convertor</filename> v distribuci PHP 3.0.
   Tento program vak zachycuje pouze zmny syntaxe, take pesto pozorn
   tte tuto kapitolu.
  </simpara>
 </section>

 <section id="migration.startendtags">
  <title>Otvrac/uzavrac znaky (start/end tags)</title>

  <para>
   Pravdpodobn prvn vc, kterou zaznamente, je, e se zmnily otevrac
   a uzavrac znaky (oznauj zatek a konec kdu PHP). Star znaky
   <literal>&lt;? &gt;</literal> byly nahrazeny temi monmi formami:   
   <example>
    <title>Pechod: star otvrac/uzavrac znaky</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>Pechod: prvn otvrac/uzavrac znaky</title>
    <programlisting role="php">
<![CDATA[
<? echo "This is PHP 3.0 code!\n"; ?>
]]>
    </programlisting>
   </example>

   Vimnte si, e uzavrac znaka nyn sestv z otaznku a znaku
   "vt ne" namsto pouhho znaku "vt ne". Bohuel, pokud na svm
   serveru plnujete pouvat XML, bude tato varianta dlat problmy,
   protoe se PHP me pokouet interpretovat XML znaku jako PHP kd.
   Z tohoto dvodu byla zavedena nov varianta:   

   <example>
    <title>Pechod: druh otvrac/uzavrac znaky</title>
    <programlisting role="php">
<![CDATA[
<?php echo "This is PHP 3.0 code!\n"; ?>
]]>
    </programlisting>
   </example>

   Nkte lid maj problmy s editory, kter zcela neporozum zpracovn
   instruknch znaek. Jednm z takovch editor je Microsoft FrontPage,
   a jako een tohoto problmu byla pidna jet dal varianta:   

   <example>
    <title>Pechod: tet otvrac/uzavrac znaky</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 zpsob, jak zapsat konstrukci if/elseif/else, za pouit
   if(); elseif(); else; endif;, neme bt efektivn implementovna bez
   podstatnho nrstu sloitosti 3.0 parseru. Kvli tomu se zmnila syntaxe:   
   <example>
    <title>Pechod: 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>Pechod: 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>

   Vimnte si, e stednky byly nahrazeny dvojtekami ve vech konstruktech
   krom zvrenho (endif).
  </para>
 </section>

 <section id="migration-while">
  <title>syntaxe while</title>
  <para>
   Stejn jako if..endif, syntaxe while..endwhile byla zmnna:
   <example>
    <title>Pechod: star syntaxe while..endwhile</title>
    <programlisting role="php">
<![CDATA[
while ($more_to_come);
    ...
endwhile;
]]>
    </programlisting>
   </example>
   <example>
    <title>Pechod: nov syntaxe while..endwhile</title>
    <programlisting role="php">
<![CDATA[
while ($more_to_come):
    ...
endwhile;
]]>
    </programlisting>
   </example>
  </para>
  <warning>
   <simpara>
    Pokud v PHP 3.0 pouijete starou syntaxi while..endwhile, zskte
    nekonenou smyku.
   </simpara>
  </warning>
 </section>

 <section id="migration.expr">
  <title>Typy vraz</title>
  <simpara>
   PHP/FI 2.0 pouvalo levou stranu vraz k uren, jakho typu m
   vsledek bt. PHP 3.0 bere pro uren typu v vahu ob strany vrazu,
   a to me zpsobit nepedvdateln chovn 2.0 skript v PHP 3.0.   
  </simpara>
  <para>
   Uvaujme tento pklad:
   <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 vak
   nezobraz nic. Dvod je ten, e PHP 2.0 kvli tomu, e na lev stran
   je etezec, provede porovnn etzc, a <literal>""</literal>
   se nerovn <literal>"0"</literal>, tedy se bude prochzet cyklem.
   V PHP 3.0 se etzec porovn s celm slem (integer), provede se
   porovnn celch sel (etzec je peveden na cel slo). Vsledkem
   je porovnn <literal>atoi("")</literal>, co je <literal>0</literal>, a
   <literal>variablelist</literal>, co je tak <literal>0</literal>.
   A protoe <literal>0==0</literal>, cyklem se vbec prochzet nebude.
  </para>
  <para>
   Oprava pro tento pklad je snadn. Nahrate pvodn konstrukci tmto:
   <informalexample>
    <programlisting role="php">
<![CDATA[
while ((string)$key != "") {
]]>
    </programlisting>
   </informalexample>
  </para>
 </section>

 <section id="migration.errors">
  <title>Chybov zprvy se zmnily</title>
  <simpara>
   Chybov zprvy PHP 3.0 jsou obvykle pesnj, ne byly ve 2.0.
   Neuvidte vak st kdu, kde nastala chyba. Vype se pouze nzev
   souboru a slo dku, kde nastala chyba.
  </simpara>
 </section>

 <section id="migration.booleval">
  <title>Zkrcen vyhodnocen logickch vraz</title>
  <simpara>
   V PHP 3.0 se pouv zkrcen vyhodnocen logickch vraz. To znamen,
   e pro vraz jako <literal>(1 || test_me())</literal> ji nebude funkce
   <function>test_me</function> volna, protoe za <literal>1</literal> ji
   nic neme ovlivnit hodnotu vrazu.
  </simpara>

  <simpara>
   Toto je mal zmna kompatibility,ale me zpsobit neoekvan vedlej
   efekty.
  </simpara>
 </section>

 <section id="migration.truefalse">
  <title>Nvratov hodnoty &true;/&false;</title>
  <simpara>
   Vtina vnitnch funkc byla pepsna tak, aby vracela &true;
   v ppad spchu a &false; pi selhn, narozdl od pvodnch hodnot
   0 a -1 v PHP/FI 2.0. Nov chovn umouje logitj programovn, jako
   <literal>$fp = fopen("/your/file") nebo fail("darn!");</literal>.
   Protoe v PHP/FI 2.0 nebyla jasn pravidla, v kterch ppadech se
   vyskakovalo z funkce pi selhn, vtina skript bude pravdpodobn muset
   bt zkontrolovna run po pouit konvertoru z 2.0 na 3.0.
  </simpara>
  <para>
   <example>
    <title>Pechod z 2.0: nvratov hodnoty, star kd</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>Pechod z 2.0: nvratov hodnoty, nov kd</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 teba Apache 1.2 nebo pozdj.
   </simpara></listitem>

   <listitem><simpara>
    Funkce <function>echo</function> ji nepodporuje formtovan etzec.
    Pouijte namsto toho <function>printf</function>.
   </simpara></listitem>

   <listitem><simpara>
    V PHP/FI 2.0 zpsobovaly vedlej efekty implementace to, e
    <literal>$foo[0]</literal> mlo 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 podporovno.
    </simpara>
    <simpara>
     To znamen, e nemete traverzovat pole v cyklu, kter provd
     <literal>$data = $array[]</literal>.  Pouijte funkce
     <function>current</function> a <function>next</function>.
    </simpara>
    <simpara>
     Souasn  <literal>$array1[] = $array2</literal> nepipojuje hodnoty pole
     <literal>$array2</literal> k poli
     <literal>$array1</literal>, nbr pipojuje pole
     <literal>$array2</literal> jako posledn poloku pole
     <literal>$array1</literal>. Viz t: podpora vcerozmrnch pol.
    </simpara>
   </listitem>

   <listitem>
    <simpara>
     <literal>"+"</literal> ji nen petovn jako spojovac opertor pro
     etzce, namsto toho konvertuje etzce na sla a provede jejich
     (numerick) souet. Pouijte tedy opertor
     <literal>"."</literal> instead.
    </simpara>
   </listitem>
  </itemizedlist>

  <example>
   <title>Pechod z 2.0: spojen etzc</title>
   <programlisting role="php">
<![CDATA[
echo "1" + "1";
]]>
   </programlisting>
   <para>
    V PHP 2.0 by se vypsalo 11, v PHP 3.0 se vype 2.
    Kdy msto toho pouijete:
    <programlisting role="php">
<![CDATA[
echo "1"."1";
]]>
    </programlisting>
    <programlisting role="php">
<![CDATA[
$a = 1;
$b = 1;
echo $a + $b;
]]>
    </programlisting>
   </para>
   <para>
    vype 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 vype 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:
-->